2016-09-30 51 views
0

我已經寫了一個程序來獲取一個數字,並打印英文文本的數字。這是我的第二次嘗試,同時試圖讓它更加濃縮並重復少一點。剛剛瞭解了遞歸,無法弄清楚如何使其工作

只要號碼爲< 100,代碼就可以正常工作,但我有問題。我嘗試刪除gets,並在方法本身上有一個參數,但是它將遞歸中的錯誤從行中移除,並將它的值添加到變量total中。

我認爲我處於一個我目前的技能不能抓住的地步。遞歸對我來說仍然感覺像是黑暗魔法。

def numberWords num 
    #num = gets.chomp.to_i 

    singles = ['one',  'two',  'three', 'four',  'five', 
      'six',  'seven',  'eight', 'nine'] 
    tens = ['eleventy',  'twenty', 'thirty', 'forty', 'fifty', 
      'sixty', 'seventy', 'eighty', 'ninety'] 
    teens = ['eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 
      'sixteen', 'seventeen', 'eighteen', 'nineteen'] 


    total = "" 

    if num == 0 
    puts "Zero" 
    end 

    current = num/1000 
    if current > 0 
    thousands = numberWords current 
    total = total + thousands + "Thousands" 
    end 

    total = total + " " 

    current = num/100 
    if current > 0 
    hundreds = numberWords current 
    total = total + hundreds + "Hundred" 
    end 

total = total + " " 

    #TENS 
    current = num/10 
    if current > 1 
    total = total + tens[current - 1] 
    end 

    total = total + " " 
    #SINGLES 

    num = num - (current*10) 
    if num > 0 
    total = total + singles[num - 1] 
    end 

    puts total 

end 

numberWords(2222) 
+1

我不知道 「eleventy」。 – mvw

+0

大聲笑,當我解決了遞歸問題時,我將添加在青少年中。 –

回答

1

試試這個版本:

def number_words(num) 
    singles = ['one',  'two',  'three', 'four',  'five', 
      'six',  'seven',  'eight', 'nine'] 
    tens = ['eleventy',  'twenty', 'thirty', 'forty', 'fifty', 
      'sixty', 'seventy', 'eighty', 'ninety'] 
    teens = ['eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 
      'sixteen', 'seventeen', 'eighteen', 'nineteen'] 

    if num == 0 
    return "zero" 
    elsif 
    num >= 1000 
    q, r = num.divmod(1000) 
    return number_words(q) + " thousand" + (r > 0 ? " " + number_words(r) : "") 
    elsif num >= 100 
    q, r = num.divmod(100) 
    return number_words(q) + " hundred" + (r > 0 ? " " + number_words(r) : "") 
    elsif num >= 20 
    q, r = num.divmod(10) 
    return tens[q - 1] + (r > 0 ? "-" + number_words(r) : "") 
    elsif num >= 11 
    r = num % 10 
    return teens[r - 1] 
    elsif num == 10 
    return "ten" 
    end 
    return singles[num - 1] 
end 

我改變它放輸出建立一個字符串。

重要的是訂購,所以如果你想要處理數百萬和數十億的條款按正確的順序。

q和r是商數和餘數的縮寫。

算術if(條件?真 - 語句:假 - 語句)用於抑制「零」字符串,他們不應該。

其基本思想是處理在if子句中可以處理的內容,並將其他工作遞歸地傳遞給一個自我。

下面是一些輸出:

0: zero 
1: one 
2: two 
3: three 
10: ten 
11: eleven 
12: twelve 
13: thirteen 
20: twenty 
21: twenty-one 
22: twenty-two 
23: twenty-three 
30: thirty 
39: thirty-nine 
99: ninety-nine 
100: one hundred 
101: one hundred one 
123: one hundred twenty-three 
221: two hundred twenty-one 
990: nine hundred ninety 
999: nine hundred ninety-nine 
1000: one thousand 
2222: two thousand two hundred twenty-two 
+0

嗨。這看起來非常乾淨。我一眼就看不清楚所看到的所有內容,但我正在閱讀,並會一直這樣做,直到我對它有更好的把握。 感謝您的幫助。這很棒。 –

+0

我加了一些解釋。 – mvw

+1

小改進:'q,r = num.divmod(1000)' – Stefan