这个 ruby​​ 代码算作递归函数吗?

Posted

技术标签:

【中文标题】这个 ruby​​ 代码算作递归函数吗?【英文标题】:Does this ruby code count as a recursive function? 【发布时间】:2018-09-26 22:42:35 【问题描述】:

我正在阅读有关递归的内容。练习之一是编写一个递归函数来对数组中的数字求和。我不应该使用Array#sum 来执行此操作。我写这个是为了模仿递归:

def recursive_sum(list)
  if list == []
    return 0
  else
    return list.shift + recursive_sum(list)
  end
end

recursive_sum [1,2,3,4]
# => 10

“递归函数/方法调用自身。”这很清楚,似乎这个函数确实调用了自己。但我不确定这是否算作递归函数,因为我在其中使用了shift 方法。

【问题讨论】:

是的,它是一个递归函数。 为什么你认为你可能不被允许使用shift 是的,它是递归的,但请考虑def recursive_sum(list); first, *rest = list; rest.empty? ? first : first + recursive_sum(rest); end。注意如果first, *rest = [1,2,3],那么first #=> 1rest #=> [2,3] @Stefan。我认为我应该使用更基本的操作(如索引)来实现这一点。事实证明,这个想法是错误的。 您可以考虑使用不修改其接收器的方法(如上面的 Cary Swoveland 所建议的)。但这不会影响您的方法的“递归性”。 【参考方案1】:

是的,由于您已经提到的原因,我将其称为递归函数:“递归函数/方法调用自身。”

该方法调用shift 没有害处。事实上,它也调用了其他方法——比如if==+

您不能调用任何其他方法,只能调用该方法本身,而该方法将无法做任何有用的事情。

def foo
  foo
end

调用该递归方法会引发SystemStackError (stack level too deep)

【讨论】:

吹毛求疵,但if 不是一种方法。

以上是关于这个 ruby​​ 代码算作递归函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释这个递归函数吗? [关闭]

从分层数组Ruby生成平面数组的递归函数[关闭]

这个 c 递归函数有啥原因会产生这个页面错误吗?

Ruby:应该从子数组返回最大值数组的递归函数的问题

嵌套递归调用 - 这是尾递归吗?

lambda 函数可以在 Python 中递归调用自身吗?