编辑:我在 Stack Overflow 上找到了以下代码,而不是我使用单个变量搜索“Fibonacci系列”。尽管付出了很多努力,但我无法理解它是如何工作的。
我在这里提出这个问题是为了帮助理解读者。
你感谢红豆杉!
#include <stdio.h>
#include <stdlib.h>
int main (void) {
unsigned long i = 1;
printf ("0\n");
while (((i & 0xffff0000) >> 16) + (i & 0xffff) <= 0xffff) {
printf ("%d\n", i & 0xffff);
i = ((i & 0xffff) << 16) | ((i >> 16) + (i & 0xffff));
}
return 0;
}
产生:
0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
答案 0 :(得分:0)
我不明白为什么这很难? 用C语言编写,在IDEOne上演示:
#include <stdio.h>
int fib(int n)
{
return (n == 0 || n == 1) ? n : fib(n-1) + fib(n-2);
}
int main(void) {
int n;
for(n=0; n<10; ++n)
printf("[%d] : %d\n", n, fib(n));
return 0;
}
我只看到1个变量 这不符合你的要求吗?
<强>输出强>
[0] : 0
[1] : 1
[2] : 1
[3] : 2
[4] : 3
[5] : 5
[6] : 8
[7] : 13
[8] : 21
[9] : 34
如果你想变得棘手,请使用精彩的表达式n==!!n?n:
int fib(int n)
{
return n==!!n?n: fib(n-1) + fib(n-2);
}
答案 1 :(得分:0)
我在这里看到答案:Fibonacci using 1 variable
如其中一个答案所示。虽然封闭形式的解决方案通常很难得到,除非你知道如何解决Difference equations并解决斐波那契复发问题
Fn = Fn-1 + Fn-2
我认为更好的方法是线性代数。
可以通过归纳轻松完成证明。矩阵乘法也需要O(lgn)。