如果时间很重要(不是编程技术):
function f = fib(n)
if (n == 1)
f = 1;
elseif (n == 2)
f = 2;
else
fOld = 2;
fOlder = 1;
for i = 3 : n
f = fOld + fOlder;
fOlder = fOld;
fOld = f;
end
end
end
tic;fib(40);toc; ans = 165580141; Elapsed time is 0.000086 seconds.
您甚至可以使用uint64。 n = 92 是您可以从uint64 获得的最多:
tic;fib(92);toc; ans = 12200160415121876738; Elapsed time is 0.001409 seconds.
因为,
fib(93) = 19740274219868223167 > intmax('uint64') = 18446744073709551615
编辑
为了得到fib(n) 到n = 183,可以用两个uint64作为一个数,
具有求和的特殊功能,
function [] = fib(n)
fL = uint64(0);
fH = uint64(0);
MaxNum = uint64(1e19);
if (n == 1)
fL = 1;
elseif (n == 2)
fL = 2;
else
fOldH = uint64(0);
fOlderH = uint64(0);
fOldL = uint64(2);
fOlderL = uint64(1);
for i = 3 : n
[fL q] = LongSum (fOldL , fOlderL , MaxNum);
fH = fOldH + fOlderH + q;
fOlderL = fOldL;
fOlderH = fOldH;
fOldL = fL;
fOldH = fH;
end
end
sprintf('%u',fH,fL)
end
LongSum 是:
function [s q] = LongSum (a, b, MaxNum)
if a + b >= MaxNum
q = 1;
if a >= MaxNum
s = a - MaxNum;
s = s + b;
elseif b >= MaxNum
s = b - MaxNum;
s = s + a;
else
s = MaxNum - a;
s = b - s;
end
else
q = 0;
s = a + b;
end
注意LongSum 中的一些复杂问题可能看起来没有必要,但实际上并非如此!
(与内部if 的所有处理是我想在一个命令中避免s = a + b - MaxNum,因为它可能会溢出并在s 中存储一个不相关的数字)
结果
tic;fib(159);toc; Elapsed time is 0.009631 seconds.
ans = 1226132595394188293000174702095995
tic;fib(183);toc; 经过的时间是 0.009735 秒。
fib(183) = 127127879743834334146972278486287885163
但是,您必须小心sprintf。
我也用三个 uint64 做到了,我可以达到,
tic;fib(274);toc; 经过的时间是 0.032249 秒。
ans = 1324695516964754142521850507284930515811378128425638237225
(几乎是相同的代码,但如果您有兴趣,我可以分享)。
请注意,根据问题,我们有 fib(1) = 1 , fib(2) = 2,虽然 fib(1) = 1 , fib(2) = 1 更常见,但前 300 个 fib 列出了 here(感谢 @Rick T)。