在递归函数中使用基础变量重要吗?
2020-7-1 14:29:45
收藏:0
阅读:147
评论:2
我正在学习递归,它非常难以理解。我发现一个非常常见的例子:
function factorial(N)
local Value
if N == 0 then
Value = 1
else
Value = N * factorial(N - 1)
end
return Value
end
print(factorial(3))
N == 0 是基础案例。但是当我将其更改为 N == 1 时,结果仍然保持不变。_(它将打印出 6)_.
使用基础案例很重要吗?(会破坏或其他什么东西吗?)
使用 N == 0 (基础案例) 和 N == 1 有什么区别呢?
点赞
用户9922866
正如上面的答案和评论所指出的那样,在递归函数中必须有一个基本情况,否则就会形成无限循环。
此外,在您的阶乘函数的情况下,使用一个辅助函数来执行递归可能更有效,因此可以利用Lua的尾调用优化。由于Lua方便地允许本地函数,因此可以在阶乘函数的作用域内定义一个辅助函数。
请注意,此示例不适用于负数的阶乘。
-- 需要:n是大于或等于0的整数。
-- 效果:返回n的阶乘。
function fact(n)
-- 实际执行递归的本地函数。
local function fact_helper(n, i)
-- 这是基本情况。
if (i == 1) then
return n
end
-- 利用尾调用。
return fact_helper(n * i, i - 1)
end
-- 检查边缘情况,比如fact(0)和fact(1)。
if ((n == 0) or (n == 1)) then
return 1
end
return fact_helper(n, n - 1)
end
2020-07-01 17:18:25
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

这只是一个巧合,因为
1 * 1 = 1,所以无论如何它都能工作。但是考虑到边缘情况,即
N = 0,如果你检查N == 1,那么你将进入 else 分支并计算0 * factorial(-1),这将导致无限循环。如果你直接调用
factorial(-1),那么两种情况都会发生,这就是为什么你应该使用>0进行检查(实际上将每个负值视为0并返回 1),或者添加另一个 if 条件,并在N为负数时引发错误。编辑:正如另一个答案指出的那样,你的实现不是尾递归,这意味着它在每个递归函数调用中累积内存,直到完成或耗尽内存。
你可以使函数成为尾递归,这使得 Lua 能够将它视为一个几乎可以运行多长时间来计算其结果的普通循环:
local function factorial(n, acc) acc = acc or 1 if n <= 0 then return acc else return factorial(n-1, acc*n) end return Value end print(factorial(3))请注意,对于阶乘,你用尽栈内存比 Luas 数字数据类型溢出要花费更长的时间,在大约
21!处。因此,使它成为尾递归只是训练自己编写更好的代码的问题。