2012-08-09 55 views
0

所以我知道在Ruby中Math.sqrt(number)方法,但作为学习语言的一部分,我认为这是一个好主意,使一些简单的功能。我可以去有关从根本上找到平方根错,但这里是我所做的:堆栈太深红宝石错误,学习sqrt程序

def negative?(number) 
    number < 0 
end 

@start = 2 

def sqrt(number) 
    if negative? number 
    puts "Can't do negative" 
    else 
    if @start**2 < number 
     @start += 0.01 
     sqrt(number) 
    else 
     puts "Square root of #{number} is #{@start}!" 
    end 
    end 
end 

def start_sqrt 
    print "Input text: " 
    number = Integer(gets.strip) 
    sqrt(number) 
end 

begin 
    start_sqrt 
rescue ArgumentError 
    puts "Need a positive number!" 
end 

这对于较小的数字工作正常,但是当我进入更大的数字,我需要改变的值@开始,如果我想得到答案,否则它说“堆太深”。我在代码中做了什么错误,或者Ruby做的很好,我只是要求它以资源密集型的方式找到数字的平方根?我想这也许是更不是编程的问题,更数学问题的,因为我知道我可能只是这样做:

def sqrt(number) 
    if negative? number 
    puts "Can't do negative" 
    else 
    root = number**0.5 
    puts "Square root of #{number} is #{root}!" 
    end 
end 
+1

当数字很大时,您需要太多的递归,堆栈变得太深。 – Mischa 2012-08-09 16:26:36

回答

3

它看起来像红宝石按预期工作。您要求它以资源密集型方式查找数字的平方根(递归)。

实际上,您已经创建了堆栈溢出错误。 :)

+0

甚至没有进行堆栈溢出连接......这很有趣 – 2012-08-09 18:32:16