0

I am trying to take a number from 0-999999999 and produce the word for that number. I have a hash with the numbers => words. This worked for numbers 0 - 999, I wanted to add if statements to handle the number if it was > 1000 and < 1000000. If so I would divide the number by 1000 and mod 1000 +1000. But I get this error.

ERROR: 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

Code:

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

我遇到的主要问题是|| 而不是 &&,以及尝试在私有方法中创建我的 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 回答
0

您在标记线上的每次通话都会增加传递给 _in_english 的数字。

in_english(number % 1000000 + 1000000)永远不会终止,递归的关键部分是你必须有一个案例,它会返回一个最终值。

于 2013-07-24T16:00:23.413 回答