加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 01:24:12 所属栏目:百科 来源:网络整理
导读:假设我有这个代码: 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} tt 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读