Ruby 当计算阶乘时,为什么这个递归方法不起作用?
有人能帮我理解为什么下面的代码工作得很好吗 作品:Ruby 当计算阶乘时,为什么这个递归方法不起作用?,ruby,recursion,Ruby,Recursion,有人能帮我理解为什么下面的代码工作得很好吗 作品: def factorial(n) return 1 if n == 1 n * factorial(n-1) end puts factorial(5) def count_down(number) puts number count_down(number - 1) unless number == 0 end count_down(10) 但当我像这样重构它时,它会抛出一个异常:“”:nil不能强制为整数(Typ
def factorial(n)
return 1 if n == 1
n * factorial(n-1)
end
puts factorial(5)
def count_down(number)
puts number
count_down(number - 1) unless number == 0
end
count_down(10)
但当我像这样重构它时,它会抛出一个异常:“”:nil不能强制为整数(TypeError)
失败:
def factorial(n)
puts n
n * factorial(n-1) unless n == 1
end
factorial(5)
作为另一个示例,此代码工作正常,并以类似的方式编写:
作品:
def factorial(n)
return 1 if n == 1
n * factorial(n-1)
end
puts factorial(5)
def count_down(number)
puts number
count_down(number - 1) unless number == 0
end
count_down(10)
这段代码运行良好,并且是以类似的方式编写的
不,不是。您的倒计时
一点也不相似,因为它不返回值
但是您的factorial
确实返回一个值,并且每个递归调用都使用该值
好的,您的第二个示例没有说明当n
为1时返回什么,因此它返回nil
,调用堆栈崩溃
您的第一个示例说明了
n
为1时返回的内容。这就是区别。根据我的理解,它应该执行5x(5-1)、5x(4-1)、5x(3-1)、5x(2-1),在这一点上,因为达到1,它应该停止执行。我要计算2*阶乘(1)
您需要阶乘(1)
的值-它返回什么?您最终得到的是2*nil
,因此出现了错误。感谢@Stefan现在说得通了问题当然是Ruby函数没有定义契约。如果这是Swift或类似的编译语言,则您的factorial
会声明它返回一个整数,然后编译器会在第二个示例中抱怨您并不总是返回整数,并且代码甚至不会运行。当然,Ruby只是愉快地跳过了所有这些,毫无疑问地运行,在我们真正尝试执行递归的1
循环之前,不会出现任何问题,Ruby会返回nil
,因为它不知道还能做什么谢谢@matt现在所有的点击都有意义了