当前位置 : 主页 > 编程语言 > ruby >

ruby – 为什么在递归proc调用中添加1会返回调用的计数?

来源:互联网 收集:自由互联 发布时间:2021-06-23
假设我有这个代码: def rcall(num) return 0 if 10 == num 1 + rcall(num - 1)endp rcall(90) # = 80 此代码将始终返回10小于传递给num的值,即递归调用的计数. 我看不出它是如何工作的.我有一个模糊的理解
假设我有这个代码:

def rcall(num)
  return 0 if 10 == num
  1 + rcall(num - 1)
end

p rcall(90) # => 80

此代码将始终返回10小于传递给num的值,即递归调用的计数.

我看不出它是如何工作的.我有一个模糊的理解,即如果满足退出条件则返回零,以便不再增加计数器.但是,确切地说,如何在proc调用中添加一个增加被调用的次数?我无法看到增量器的累积位置.

此外,这是一种特定于Ruby架构的技术,还是更普遍适用?我没有在问及如何计算递归调用的问题的任何答案中看到它;似乎大多数时候人们通过计数器变量来跟踪计数.

我刚刚为你的代码添加了一些看法,也许有助于更好地遵循逻辑,而不是用我的英语解释.

所以,这是经过调整的代码:

def rcall(num)
  if 10 == num
    rec = 0
    puts "rec = #{rec} ---- End of recursion"
    return rec
  end
  rec = rcall(num - 1)
  res = 1 + rec
  puts "rec = #{rec} \t\t res = i + rec = #{res}"
  res
end

例如,当你打电话给15时,你得到:
RCALL(15)

# rec = 0 ---- End of recursion
# rec = 0      res = i + rec = 1
# rec = 1      res = i + rec = 2
# rec = 2      res = i + rec = 3
# rec = 3      res = i + rec = 4
# rec = 4      res = i + rec = 5
# 5

如果调用小于10的数字,则永远不会到达递归的末尾,因此不会返回任何值来构建“调用堆栈”并引发错误:堆栈级别太深(SystemStackError)

其他语言支持递归,例如Python.这里是着名的斐波纳契(How to write the Fibonacci Sequence?).

我还想在YouTube上分享这个关于递归的Computerphile视频:https://youtu.be/Mv9NEXX1VHc

网友评论