0

有谁知道为什么这个代码:

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>'

该代码非常有意义,您可以理解它在做什么。

4

5 回答 5

3

在函数外部声明的普通变量在函数内部是不可访问的。

sum您可以使用前缀$使其成为全局变量(通常不是一个好主意。)

$sum=0
def get_sum n
    return $sum if n<1
    $sum=$sum+n
    get_sum(n-1)
end 

get_sum 10
#= 55

如果您有一个真正的测试用例想要执行此操作,如果您愿意,我可以建议一种合适的方法。

于 2013-04-03T12:02:43.283 回答
2

不是使用全局变量,而是使用递归的另一种方法是这样的(我猜受堆栈深度的限制):

def get_sum(n)
  return n if n < 1
  n + get_sum(n - 1)
end

sum = get_sum(10)

如果您曾经使用过提供尾调用优化的 Ruby 实现(我不知道有任何实现),ProGNOMmers 的方法在堆栈上会更好一些,但作为快速测试,两者都超过了最大堆栈级别n = 9000或者。并不是说您应该递归 9000 次或其他任何东西。

于 2013-04-03T12:05:37.387 回答
1

正如@Dogbert 所写,在函数外部声明的普通变量在函数内部是不可访问的

这是一种不使用全局变量(不适合递归)的方法:

def get_sum(n, sum = 0)
    return sum if n<1
    get_sum(n-1, sum+n)
end 

get_sum(10) #=> 55
于 2013-04-03T12:05:28.103 回答
0

您从未sum在使用它之前初始化变量。

您可以完全避免使用该变量,因为它什么都不做:

def get_sum n
    return 0 if n<1
    get_sum(n-1) + n
end 

get_sum 10
于 2013-04-03T12:05:07.930 回答
-1

你可能想试试这个:

def get_sum n
    return n if n == 0
    return n + get_sum(n-1)
end 

在这个版本中,您不需要实例化任何全局变量(这不是一个好主意),并且您实际上执行了一个回归求和 :)

于 2013-04-03T12:08:24.320 回答