Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 当计算阶乘时,为什么这个递归方法不起作用?_Ruby_Recursion - Fatal编程技术网

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现在所有的点击都有意义了