关于fibonacci递归算法和迭代算法在C和Scheme下实现存在差距的疑惑

leequnwan 2007-08-29 11:11:09
最近在学 Mit OCW 上的 SICP课程中,发现了二个分别用递归和迭代实现fibonacci序列的算法,书上用的是scheme语言来实现,后来,我又自己用C语言来实现,具体代码如下:
Dr Scheme:
;用递归
(define (fib n) (cond ((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1)) (fib (- n 2))))))

(fib 35)
;用迭代
(define (fiba n)(fib-iter 1 0 n))
(define (fib-iter a b count)(if (= count 0)
b
(fib-iter (+ a b) a (- count 1))))
(fiba 38)
-------------------------------------------------------------------------------------------------------
Visual C++ 6.0:

#include<stdio.h>
#define Recursion

#ifdef Recursion /* 递归算法 */
int Fibonacci(int n)
{
if(n < 0)
printf("The fibonacci number exists only with nonnegative index.\n");
else
{
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}
#else /* 迭代算法 */
int Fibonacci_iter(int a, int b, int count)
{
if(count == 0)
return b;
else
return Fibonacci_iter(a + b, a, count - 1);
}

int Fibonacci(int n)
{
return Fibonacci_iter(1, 0, n);
}
#endif

int main()
{
printf("fib(38): %d.\n", Fibonacci(38));
}
---------------------------------------------------------------------------------------------------
结果:
在 DrScheme下实现的这两个算法千差万别, 用递归的算法明显比迭代算法慢(在我的机器上,用迭代可以在1s内求得
fib(1000),而用递归则必须用5s来实现fib(35),)
在 visual C++ 6.0下实现这两个算法却没有多大的区别(两个算法都是到了fib(35)以后就速度慢如牛)。
----------------------------------------------------------------------------------------------------
疑惑:
难道在Visual C++ 6.0下, 这两个算法都是递归算法,那么递归和迭代的区别究竟是什么?为什么同样的算法在不同的语言实现下有不同的结果?Dr Scheme编译是否不像VC一样调用函数时使用堆栈?

...全文
417 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
leequnwan 2007-09-02
  • 打赏
  • 举报
回复
不好意思,看错了,我还以为Fibonacci()调用了Fibonacci_iter()!
leequnwan 2007-09-02
  • 打赏
  • 举报
回复
lg84,你再试一下把你的程序该为
int main()
{
int f1;
int f2;
int n;
clock_t st,ft;
printf("Please enter n:");
scanf("%d",&n);

// st = clock();
// f1 = Fibonacci(n);
// ft = clock();
// printf("耗时:%f ms\n",(double)(ft-st));

st = clock();
f2 = Fibonacci_iter(1, 0, n); /////////////////////////这里改为 f2 = Fibonacci(n)
ft = clock();
printf("result=%d ",f2);
printf("耗时:%f\n ms",(double)(ft-st));
}
速度也是相当慢的!
leequnwan 2007-09-02
  • 打赏
  • 举报
回复
iatsbg说这个是递归,我也觉得是递归呀
可是lg84的程序我试验了一下,速度确实很快。我想应该是我的#ifdef...#else...#endif失效了吧。

觉得比较迷糊,如果是递归的话,速度也不至于向lg84说的那么快!
llg84 2007-08-31
  • 打赏
  • 举报
回复
试了一下,VC的那个迭代挺快的,计算10000都没花多长时间



#include <stdio.h >
#include <time.h>

int Fibonacci(int n)
{
if(n < 0)
printf("The fibonacci number exists only with nonnegative index.\n");
else
{
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}

int Fibonacci_iter(int a, int b, int count)
{
if(count == 0)
return b;
else
return Fibonacci_iter(a + b, a, count - 1);
}


int main()
{
int f1;
int f2;
int n;
clock_t st,ft;
printf("Please enter n:");
scanf("%d",&n);

// st = clock();
// f1 = Fibonacci(n);
// ft = clock();
// printf("耗时:%f ms\n",(double)(ft-st));

st = clock();
f2 = Fibonacci_iter(1, 0, n);
ft = clock();
printf("result=%d ",f2);
printf("耗时:%f\n ms",(double)(ft-st));
}
iatsbg 2007-08-29
  • 打赏
  • 举报
回复
严格来说,VC6.0的那个迭代也是递归来的,因为Fibonacci_iter调用了自己。

迭代是:先计算小问题,然后再根据小问题的结果计算大问题。
递归是:直接计算大问题。找出解决这个大问题之前必须解决的小问题,解决这些小问题,综合小问题的结果解决大问题。

递归算法可能会重复解决同样的小问题,所以较迭代慢。
mathe 2007-08-29
  • 打赏
  • 举报
回复
在VC下面,两种算法花费的时间也应该很大,不应该第二种方法很慢。两种算法明显一个线性时间复杂度,一个指数时间复杂度。

33,019

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧