0

0 から 999999999 までの数字を取り、その数字の単語を生成しようとしています。数字=>単語のハッシュがあります。これは 0 ~ 999 の数値で機能しました。1000 より大きく 1000000 未満の数値を処理する if ステートメントを追加したかったのです。しかし、私はこのエラーが発生します。

エラー: say.rb:44:in _in_english': stack level too deep (SystemStackError) from say.rb:45:in_in_english' from say.rb:33:in `in_english' from say.rb:65

コード:

private

def _in_english(number)    
    if number > 1000000 || number <1000000000
     _in_english(number/1000000) + _in_english(number%1000000+1000000) <== Line it fails on!
    elsif number > 1000 || number <1000000
        _in_english(number/1000) + _in_english(number%1000+1000)  
    else
        index = ENGLISH.keys.select {|n| n <= number}.max
        ENGLISH[index] + (index < number ? " " +  _in_english(number-index) : '')
    end
end
4

2 に答える 2

0

マークされた行での呼び出しごとに、_in_english に渡される数を増やしています。

in_english(number % 1000000 + 1000000)再帰の重要な部分は、最終的な値を返すケースが必要だということです。

于 2013-07-24T16:00:23.413 に答える
0

私が抱えていた主な問題は || でした。&& の代わりに、プライベート メソッドで if ステートメントを作成しようとしています。

これは、誰かがこれをクリーンアップする方法を教えてくれることを望んでいる私の実例です。

class Say
ENGLISH = { 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 => 'one hundred ', 200 => 'two hundred ', 300 => 'three hundred ',
 400 => 'four hundred ', 500 => 'five hundred ', 600 => 'six hundred ',
 700 => 'seven hundred ', 800 => 'eight hundred ', 900 => 'nine hundred ',

 1000 => 'thousand ', 1000000 => 'million '}

def initialize(num)
    @number = num
end

def in_english()
    if @number < 0 || @number > 999999999
        puts "#{@number} is not within the range of  0 - 99999999999"
        raise ArgumentError, "Number is out of range "
    elsif @number > 1000000 && @number < 1000000000
        _in_english(@number/1000000) + _in_english((@number%1000000)/1000+1000000) + _in_english(@number%1000+1000)
    elsif @number > 1000 && @number < 1000000
        _in_english(@number/1000) + _in_english(@number%1000+1000)
    else
        _in_english(@number)
    end
end

private
def _in_english(number)
    index = ENGLISH.keys.select {|n| n <= number}.max
    ENGLISH[index] + (index < number ? _in_english(number-index) : '')
end 


end
于 2013-07-25T14:21:15.463 に答える