Fibonacci系列的逻辑使用1个变量?

时间:2017-09-29 17:18:22

标签: algorithm

编辑:我在 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

Reference: Fabonacci Series using one variable

2 个答案:

答案 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

我认为更好的方法是线性代数。

enter image description here

可以通过归纳轻松完成证明。矩阵乘法也需要O(lgn)。