Lua函数陷入循环



我使用的是标准的lua 5.4.4发行版和解释器,没有库等。

我试图写一个脚本来评估Collatz猜想的用户定义值(TLDR在底部)

我希望脚本读取用户输入(这部分工作,所以我没有包括它)并根据该输入设置一个起始数字(ognumber)和一个尝试

的数字范围。然后,我希望它遍历ognumber和范围之间的每个数字(以1为增量)对于每次迭代,我想让它检查每个数字是奇数还是偶数,做一些数学运算,结果是"newnumber",然后设置number = newnumber来尝试前一次操作的结果。

我面临的问题是,当我调用函数时,它并没有结束。它一直在尝试相同的数字,它不会返回number,也不会设置number = newnumber。

function isodd(number, newnumber, ResultsPath, results)
newnumber = math.floor(number * 3 + 1)
print(number..' x 3 + 1 = '..newnumber)
local writetoresultsfile = io.open(ResultsPath..'3n+1-'..results..'.xml', 'a')
writetoresultsfile:write('      '..number..' x 3 + 1 = '..newnumber..'n')
writetoresultsfile:close()
number = math.floor(newnumber)
return number
end
function iseven(number, newnumber, ResultsPath, results)
newnumber = math.floor(number / 2)
print(number..' / 2 = '..newnumber)
local writetoresultsfile = io.open(ResultsPath..'3n+1-'..results..'.xml', 'a')
writetoresultsfile:write('      '..number..' / 2 = '..newnumber..'n')
writetoresultsfile:close()
number = math.floor(newnumber)
return number
end
for number = ognumber, range, 1 do
local writetoresultsfile = io.open(ResultsPath..'3n+1-'..results..'.xml', 'a')
writetoresultsfile:write('    <List name = "Attempt '..ognumber..'"> n')
writetoresultsfile:close()
print('Trying '..number)

while(number > 1) do
if(number % 2 ~= 0) then
isodd(number, newnumber, ResultsPath, results)
else
iseven(number, newnumber, ResultsPath, results)
end
end
ognumber = ognumber + 1
number = ognumber
end
if(ognumber == range + 1) then
local resultsfile = io.open(ResultsPath..'3n+1-'..results..'.xml', 'a')
resultsfile:write('  </Table>n')
resultsfile:write('</Data>n')
resultsfile:close()
end

这是当我使用function()

运行脚本时显示的结果这个脚本可以工作,但是我想用函数

实现同样的事情
for number = ognumber, range, 1 do
local writetoresultsfile = io.open(ResultsPath..'3n+1-'..results..'.xml', 'a')
writetoresultsfile:write('    <List name = "Attempt '..ognumber..'"> n')
writetoresultsfile:close()
print('Trying '..number)

while(number > 1) do
if(number % 2 ~= 0) then
newnumber = math.floor(number * 3 + 1)
print(number..' x 3 + 1 = '..newnumber)
local writetoresultsfile = io.open(ResultsPath..'3n+1-'..results..'.xml', 'a')
writetoresultsfile:write('      '..number..' x 3 + 1 = '..newnumber..'n')
writetoresultsfile:close()
number = newnumber
else
newnumber = math.floor(number / 2)
print(number..' / 2 = '..newnumber)
local writetoresultsfile = io.open(ResultsPath..'3n+1-'..results..'.xml', 'a')
writetoresultsfile:write('      '..number..' / 2 = '..newnumber..'n')
writetoresultsfile:close()
number = newnumber
end
end
ognumber = ognumber + 1
number = ognumber
end
if(ognumber == range + 1) then
local resultsfile = io.open(ResultsPath..'3n+1-'..results..'.xml', 'a')
resultsfile:write('  </Table>n')
resultsfile:write('</Data>n')
resultsfile:close()
end

这是当我不使用function()

时显示的结果编辑:这个脚本使用Shingo给我的建议工作

function isodd(number, ResultsPath, results)
newnumber = math.floor(number * 3 + 1)
print(number..' x 3 + 1 = '..newnumber)
local writetoresultsfile = io.open(ResultsPath..'3n+1-'..results..'.xml', 'a')
writetoresultsfile:write('      '..number..' x 3 + 1 = '..newnumber..'n')
writetoresultsfile:close()
number = math.floor(newnumber)
return number
end
function iseven(number, ResultsPath, results)
newnumber = math.floor(number / 2)
print(number..' / 2 = '..newnumber)
local writetoresultsfile = io.open(ResultsPath..'3n+1-'..results..'.xml', 'a')
writetoresultsfile:write('      '..number..' / 2 = '..newnumber..'n')
writetoresultsfile:close()
number = math.floor(newnumber)
return number
end
for number = ognumber, range, 1 do
local writetoresultsfile = io.open(ResultsPath..'3n+1-'..results..'.xml', 'a')
writetoresultsfile:write('    <List name = "Attempt '..ognumber..'"> n')
writetoresultsfile:close()
print('Trying '..number)

while(number > 1) do
if(number % 2 ~= 0) then
number = isodd(number, ResultsPath, results)
else
number = iseven(number, ResultsPath, results)
end
end
ognumber = ognumber + 1
number = ognumber
end
if(ognumber == range + 1) then
local resultsfile = io.open(ResultsPath..'3n+1-'..results..'.xml', 'a')
resultsfile:write('  </Table>n')
resultsfile:write('</Data>n')
resultsfile:close()
end

TLDR关于Collatz猜想Collatz猜想指出,对于任何正整数,如果你对它应用两个规则,它将总是返回1。

规则是:如果前一个数字是偶数,下一个数字是前一个数字的一半。如果前一个数是奇数,下一个数是前一个数的3倍加1

虽然您从函数返回number,但它不会被更新到作用域之外,您需要像这样接受它(与iseven相同):

number = isodd(number, newnumber, ResultsPath, results)

而且newnumber只在函数内部使用,所以不需要作为参数。函数可以修改为:

function isodd(number, ResultsPath, results)
local newnumber = math.floor(number * 3 + 1)

最新更新