Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Lua中创建Fibonacci序列?_Lua_Fibonacci_Lua 5.3 - Fatal编程技术网

如何在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,已修复。