如何在Lua中创建Fibonacci序列?
我写了一个小脚本,创建斐波那契序列并返回所有偶数整数的和如何在Lua中创建Fibonacci序列?,lua,fibonacci,lua-5.3,Lua,Fibonacci,Lua 5.3,我写了一个小脚本,创建斐波那契序列并返回所有偶数整数的和 function even_fibo() -- create Fibonacci sequence local fib = {1, 2} -- starting with 1, 2 for i=3, 10 do fib[i] = fib[i-2] + fib[i-1] end -- calculate sum of even numbers local fib_sum = 0 for _, v in
function even_fibo()
-- create Fibonacci sequence
local fib = {1, 2} -- starting with 1, 2
for i=3, 10 do
fib[i] = fib[i-2] + fib[i-1]
end
-- calculate sum of even numbers
local fib_sum = 0
for _, v in ipairs(fib) do
if v%2 == 0 then
fib_sum = fib_sum + v
end
end
return fib_sum
end
fib = even_fibo()
print(fib)
该函数创建以下序列:
1,2,3,5,8,13,21,34,55
并返回其偶数之和:44
但是,当我将停止索引从10
更改为100
时,在中,对于I=3,100 do
返回的和是负数-8573983172444283806
,因为值变得太大。
为什么我的代码适用于
10
而不适用于100
?在5.3版之前,Lua总是将数字作为浮点数存储在内部。在5.3中,Lua数可以作为整数或浮点数存储在内部。一个选择是运行Lua5.2,我想您会发现您的代码在那里可以正常工作。另一个选项是使用浮点数初始化数组,这将在将来将对数组的所有操作升级为浮点数:
local fib = {1.0, 2.0}
这是事后诸葛亮写的一篇文章。 该代码利用了一个数学事实,即偶数斐波那契数正好是3的倍数。 这使我们能够避免测试非常大的数字的奇偶校验,并在使用浮点进行计算时提供正确的高阶数字。然后,我们只查看低阶数字,然后将结果合并。输出为
286573922006908542050
,符合。d
值在5到15之间可以正常工作
a,b=0.0,1.0
s=0
d=10
for n=1,100/3 do
a,b=b,a+b
a,b=b,a+b
s=s+b
a,b=b,a+b
end
h=string.format("%.0f",s):sub(1,-d-1)
m=10^d
a,b=0,1
s=0
for n=1,100/3 do
a,b=b,(a+b)%m
a,b=b,(a+b)%m
s=(s+b)%m
a,b=b,(a+b)%m
end
s=string.format("%0"..d..".0f",s)
print(h..s)
您正在运行哪个版本的lua(
lua-v
)?我使用lua 5.3运行此脚本。这不会解决OP的问题“计算偶数fib数之和”,即使是大约。因为当使用浮点数时,2^53以上的所有数字(即从fib[78]
开始)都被认为是偶数。结果值fib_sum
无论如何都是错误的。在数组{1.0,2.0}
中使用浮点数,我得到1.5005088278427e+21
行print(h..s)
值s
在转换为字符串时可能需要用零填充。@EgorSkriptunoff,已修复。