有谁知道为什么这个代码:
sum=0
def get_sum n
return sum if n<1
sum=sum+n
get_sum(n-1)
end
get_sum 10
给我这个?
rb:3:in `get_sum': undefined local variable or method `sum' for main:Object (NameError)
from 1.rb:8:in `<main>'
该代码非常有意义,您可以理解它在做什么。
有谁知道为什么这个代码:
sum=0
def get_sum n
return sum if n<1
sum=sum+n
get_sum(n-1)
end
get_sum 10
给我这个?
rb:3:in `get_sum': undefined local variable or method `sum' for main:Object (NameError)
from 1.rb:8:in `<main>'
该代码非常有意义,您可以理解它在做什么。
在函数外部声明的普通变量在函数内部是不可访问的。
sum您可以使用前缀$使其成为全局变量(通常不是一个好主意。)
$sum=0
def get_sum n
return $sum if n<1
$sum=$sum+n
get_sum(n-1)
end
get_sum 10
#= 55
如果您有一个真正的测试用例想要执行此操作,如果您愿意,我可以建议一种合适的方法。
不是使用全局变量,而是使用递归的另一种方法是这样的(我猜受堆栈深度的限制):
def get_sum(n)
return n if n < 1
n + get_sum(n - 1)
end
sum = get_sum(10)
如果您曾经使用过提供尾调用优化的 Ruby 实现(我不知道有任何实现),ProGNOMmers 的方法在堆栈上会更好一些,但作为快速测试,两者都超过了最大堆栈级别n = 9000或者。并不是说您应该递归 9000 次或其他任何东西。
正如@Dogbert 所写,在函数外部声明的普通变量在函数内部是不可访问的。
这是一种不使用全局变量(不适合递归)的方法:
def get_sum(n, sum = 0)
return sum if n<1
get_sum(n-1, sum+n)
end
get_sum(10) #=> 55
您从未sum在使用它之前初始化变量。
您可以完全避免使用该变量,因为它什么都不做:
def get_sum n
return 0 if n<1
get_sum(n-1) + n
end
get_sum 10
你可能想试试这个:
def get_sum n
return n if n == 0
return n + get_sum(n-1)
end
在这个版本中,您不需要实例化任何全局变量(这不是一个好主意),并且您实际上执行了一个回归求和 :)