对于递归和迭代版本,我有以下Fibonacci代码:
#include <stdio.h>
typedef long long INT;
long long recursive (long long i) {
if (i == 0) return 0;
if (i == 1) return 1;
return recursive (i-1) + recursive (i-2);
}
long long iterative (long long i) {
INT counter = i-1;
INT fib1 = 0;
INT fib2 = 0;
// first iteration
fib1 = 0;
fib2 = 1;
while (counter > 0) {
INT temp1 = fib1;
INT temp2 = fib2;
fib1 = fib2;
fib2 = temp1 + temp2;
counter--;
}
}
int main (int argc, char **argv) {
printf("Result: %lli\n", iterative(10));
return 0;
}
我尝试使用GCC -O2
优化来编译它,看看递归是否会比迭代更好,但我注意到一个有趣的事情:当用-O2
编译时,迭代函数输出0而如果它被编译没有标志,它输出正确的数字。
gcc -O2 fibonacci.c -o fib && ./fib
:
Result: 0
gcc fibonacci.c -o fib && ./fib
:
Result: 55
答案 0 :(得分:0)
递归将比迭代或尾递归版本慢(通常会针对迭代版本进行优化)。两者的例子都在这个帖子中:
答案 1 :(得分:0)
您的迭代循环也不是最理想的,它使用的分配比需要的多。这就够了:
-0.6;
当然,您可以在开始时为fib1 / fib2分配初始值,而不是先将初始值初始化为0,然后再分配。
答案 2 :(得分:0)
您不是return
来自long long iterative (long long i)
的任何内容。您应该在每个非return
函数的末尾放置一个void
语句,否则,您将获得UB(未定义的行为)。
然而,该功能可能仍然“返回”某些东西。它将“返回”处理器寄存器中用于返回函数值的任何内容,这可能是您对return
的含义,可能不是。