Lua 5.4.4实现Collatz猜想时函数调用致循环卡顿求助
Lua 5.4.4下Collatz猜想脚本的函数封装问题及修复
Collatz猜想简述
任意正整数遵循两条规则最终都会回到1——若为偶数则取其一半;若为奇数则计算3倍数值加1。
问题说明
使用标准Lua 5.4.4发行版及解释器,未引入额外库,编写脚本验证用户定义数值区间的Collatz猜想:读取用户输入的起始数ognumber与测试范围,遍历区间内每个数,通过奇偶判断执行对应运算并更新number值。但调用封装的isodd、iseven函数时,脚本陷入无限循环,始终重复处理同一数值,number变量未被正确更新。
出现问题的函数版代码
-- 存在无限循环问题的函数版代码 function isodd(n) if n % 2 == 1 then n = 3 * n + 1 return true end return false end function iseven(n) if n % 2 == 0 then n = n / 2 return true end return false end io.write("输入起始数: ") local ognumber = tonumber(io.read()) io.write("输入测试范围(从起始数往后的个数): ") local range = tonumber(io.read()) for i = 0, range - 1 do local number = ognumber + i print("当前测试数: " .. number) while number ~= 1 do if iseven(number) then -- 未接收函数内部修改后的数值,number未更新 elseif isodd(number) then -- 同样未接收新值,number保持原状态 end print("当前值: " .. number) end print("测试完成: " .. number) end
问题根源:Lua采用值传递,函数内部修改的是参数的局部副本,并不会影响外部的number变量;同时调用函数后未将处理结果赋值回number,导致其值始终不变,进而触发无限循环。
可正常运行的无函数版代码
-- 无函数封装的正常运行代码 io.write("输入起始数: ") local ognumber = tonumber(io.read()) io.write("输入测试范围(从起始数往后的个数): ") local range = tonumber(io.read()) for i = 0, range - 1 do local number = ognumber + i print("当前测试数: " .. number) while number ~= 1 do if number % 2 == 0 then number = number / 2 else number = 3 * number + 1 end print("当前值: " .. number) end print("测试完成: " .. number) end
修正后可正常运行的函数版代码
-- 修正后的函数版代码:让函数返回处理后的数值,调用时赋值给number function processEven(n) return n / 2 end function processOdd(n) return 3 * n + 1 end io.write("输入起始数: ") local ognumber = tonumber(io.read()) io.write("输入测试范围(从起始数往后的个数): ") local range = tonumber(io.read()) for i = 0, range - 1 do local number = ognumber + i print("当前测试数: " .. number) while number ~= 1 do if number % 2 == 0 then number = processEven(number) else number = processOdd(number) end print("当前值: " .. number) end print("测试完成: " .. number) end
内容的提问来源于stack exchange,提问作者EchoTree
相关产品推荐
相关产品推荐

