2016-02-26 59 views
2

這個問題有你轉換成數字的話 - 300將轉化爲「三百」。我知道這個問題已經解決了堆棧溢出,但我正在尋求一些關於我的特定遞歸解決方案的建議。將數字轉換的話紅寶石 - 提高我的遞歸解決方案

我的解決方案適用於所有數字,除了相同的數字: 100,1000,百萬

以上將返回爲「百」,「千」,「萬」。我明白爲什麼會這樣。

300,3300,32000,35000,等等。任何數量的100%或1000或百萬== 0將返回爲 「3300零」。

我的唯一成功的想法是用第二種方法get_words通過in_words運行數量,如果數量是大於0之後,從解決方案中刪除「零」,而剛剛回歸「一」 +號而不是通過in_words運行如果數字是100/1000/1000000 ...

它可能是我的解決辦法只能這樣工作使用遞歸這裏,但也許我失去了一些東西的侷限性所致。任何人都可以提供一種方法來調整我的解決方案來解決這個問題?

NUMBER_DICTIONARY = { 
    0 => "zero", 
    1 => "one", 
    2 => "two", 
    3 => "three", 
    4 => "four", 
    5 => "five", 
    6 => "six", 
    7 => "seven", 
    8 => "eight", 
    9 => "nine", 
    10 => "ten", 
    11 => "eleven", 
    12 => "twelve", 
    13 => "thirteen", 
    14 => "fourteen", 
    15 => "fifteen", 
    16 => "sixteen", 
    17 => "seventeen", 
    18 => "eighteen", 
    19 => "nineteen", 
    20 => "twenty", 
    30 => "thirty", 
    40 => "forty", 
    50 => "fifty", 
    60 => "sixty", 
    70 => "seventy", 
    80 => "eighty", 
    90 => "ninety", 
    100 => "hundred", 
    1000 => "thousand", 
    1000000 => "million" 
    } 

def get_words(number) 
    result = in_words(number) 
    return "one" + " " + NUMBER_DICTIONARY[number] if (number == 100 || number == 1000 || number == 1000000) 
    return result.split(" ").delete_if { |word| word == "zero"}.join(" ") if result.include?("zero") && number > 0 
    result 
end 

def in_words(number) 
    #base case 
    return NUMBER_DICTIONARY[number] if NUMBER_DICTIONARY.include?(number) 
    #recursion 
    return in_words(number/1000000) + " " + in_words(1000000) + " " + in_words(number % 1000000) if number > 1000000 
    return in_words(number/1000) + " " + in_words(1000) + " " + in_words(number % 1000) if number > 1000 
    return in_words(number/100) + " " + in_words(100) + " " + in_words(number % 100) if number > 100 
    return in_words((number/10) * 10) + " " + in_words(number % 10) if number > 20 

end 

回答

0

我可以使用默認的參數來解決您的遞歸算法:

SCALES = [1000000, 1000, 100] 

def in_words(number, start = true) 

    return 'negative ' + in_words(-number) if number < 0 

    # One of the scales in spoken English 
    return 'one ' + in_words(number, false) if SCALES.include?(number) and start 

    #base case 
    return NUMBER_DICTIONARY[number] if NUMBER_DICTIONARY.include?(number) 

    SCALES.each do |n| 
    if number > n 
     result = [] 
     result << in_words(number/n) 
     result << in_words(n, false) 
     result << in_words(number % n, false) unless number % n == 0 
     return result.join(' ') 
    end 
    end 

    # This can only ever be reached when 100 > number > 20 
    return in_words((number/10) * 10) + " " + in_words(number % 10) 
end 

start是默認和信號真正這是一個潛在的scale in spoken English的開始。如果數字在比例的開始,它可能會以'one'作爲前綴。確定這些尺度還可以讓我概括一些重複的代碼。在比例尺開始後查找數字名稱時,我將start設置爲false。

擺脫最終「零」的更容易。如果這個人的數字是零,我們不會用英語說出來。

連接字符串偶爾會導致我的測試字之間多餘的空格,所以我改變以建立陣列和加入他們。

最後,我加入了對負數的支持。

請注意:我測試了這對一幫邊緣的情況下,我雖然的,但仍有可能是潛伏的錯誤。