You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:35:24