2016-09-30 2 views
0

Ich habe ein Programm geschrieben, um eine Zahl aufzunehmen, und die Zahl in Englisch Text zu drucken. Dies ist mein zweiter Versuch, während ich versuche, es kondensierter zu machen und weniger zu wiederholen.Gerade über Rekursion gelernt, kann nicht herausfinden, wie es funktioniert

Der Code funktioniert gut, solange die Nummer < 100 aber darüber ist, und ich habe Probleme. Ich habe versucht, die gets zu entfernen, und einen Parameter auf der Methode selbst, aber das verschoben den Fehler von der Zeile mit der Rekursion, um den Wert der Summe der Variablen hinzuzufügen.

Ich glaube, ich bin an einem Punkt, den meine aktuellen Fähigkeiten nicht erfassen. Rekursion fühlt sich immer noch wie dunkle Magie an.

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

Ich weiß nicht "eleventy". – mvw

+0

lol, ich werde in den Teenager hinzufügen, wenn ich das Rekursionsproblem einmal gelöst habe. –

Antwort

1

diese Version Versuchen:

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 

habe ich es von Puts Ausgabe eine Zeichenfolge für den Aufbau.

Wichtig ist die Reihenfolge, also wenn Sie mit Millionen und Milliarden umgehen wollen, setzen Sie diese Klauseln in die richtige Reihenfolge.

q und r sind die Abkürzungen für Quotient und Rest.

Die arithmetische if (Bedingung? True-Anweisung: false-Anweisung) wird verwendet, um "Zero" -Strings zu unterdrücken, wo sie nicht sein sollten.

Die Grundidee ist, mit dem umzugehen, was man in einer if-Klausel handhaben kann, und die andere Arbeit rekursiv an sich selbst zu übergeben.

Hier sind einige Ausgänge:

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

Hallo. Das sieht so viel sauberer aus. Ich verstehe nicht alles, was ich auf den ersten Blick sehe, aber ich lese es durch und werde es tun, bis ich es besser verstehe. Danke für die Hilfe. Das ist toll. –

+0

Ich habe ein paar Erklärungen hinzugefügt. – mvw

+1

Kleinere Verbesserung: 'q, r = num.divmod (1000)' – Stefan

Verwandte Themen