原文:http://www.oschina.net/code/snippet_132720_11752
递归和迭代是两种常用的算法,很多人知道怎么写递归和迭代,但是不知道什么时候该用递归,什么时候该用迭代。下面的代码分别通过使用递归和迭代计算Fibonacci数列,可以很清楚的看到效率的惊人差别。当然,很难有个准则说什么时候该用递归,什么时候该用迭代,但有一个很简单的判断方法: 如果你的递归调用是在函数的最后一行,那一般来说都可以改写成迭代,且效率要高很多。 (运行测试代码时,不要太大的基数,否则你会没耐心等结果的...在我的机器上,输入50,迭代几乎是瞬间出结果,但递归用了125s...光fib_cur(3)就计算了4,807,526,976次...没事的同学可以观察一下这个递归占用了多少stack。
#include <stdio.h> |
02 | #include <time.h> |
03 |
04 | long fib_iter( int n); |
05 | long fib_cur( int n); |
06 |
07 | static long COUNT = 0; |
08 |
09 | int main(){ |
10 | clock_t c_start, c_end; |
11 | int n; |
12 | printf ( "Input a number: " ); |
13 | scanf ( "%d" , &n); |
14 | c_start = clock (); |
15 | long fib_iter_result = fib_iter(n); |
16 | c_end = clock (); |
17 | printf ( "Iter: %ld, time elapsed: %ld\n" , fib_iter_result, (c_end - c_start) / CLOCKS_PER_SEC); |
18 |
19 | c_start = clock (); |
20 | long fib_cur_result = fib_cur(n); |
21 | c_end = clock (); |
22 | printf ( "Cur f(3): %ld\n" , COUNT); |
23 | printf ( "Cur: %ld, time elapsed: %ld\n" , fib_cur_result, (c_end-c_start) / CLOCKS_PER_SEC); |
24 | return 0; |
25 | } |
26 |
27 | long fib_cur( int n){ |
28 | if (n == 3) |
29 | COUNT++; |
30 | if (n <= 2) |
31 | return 1; |
32 | return fib_cur(n - 1) + fib_cur(n - 2); |
33 | } |
34 |
35 | long fib_iter( int n){ |
36 | long old = 1; |
37 | long now = 1; |
38 | long result; |
39 | while (n > 2){ |
40 | result = old + now; |
41 | old = now; |
42 | now = result; |
43 | n--; |
44 | } |
45 | return result; |
46 | } |