一个常见的递归算法例子:
//斐波那契 long Fib(int n) { if (n == 0) return 0; if (n == 1) return 1; if (n > 1) return Fib(n-1) + Fib(n-2); }
1、例如求Fib(10) 中间值Fib(3)会被求值21次。但是其实只需求一次即可,剩余的20次求职 属于资源的浪费。
2、每一次的Fib计算都导致两次的递归调用,成指数增长形势。需要大量的堆栈来存储函数调用信息存储。
以上例子是属于 尾递归形式,容易写成迭代的形式。
for(i=0;i<n;i++) //n > 2 { if(i<2) { result = 1; pre_last = result; last = result; } else { result = pre_last + last; pre_last = last; last = result; } }
再看一例子,模仿堆栈信息保存来模拟递归调用:
void recursive_print_data(unsigned int value)//value=123456,打印各个位的值,递归写法 { unsigned int result = value%10; value /= 10; if(value != 0) recursive_print_data(value); printf("%d",result); } void iterative_print_data(stack_st *stack,unsigned int value)//迭代写法,用到栈形式存储(先进后出) { int result = value; while(result != 0) { stack_push(stack,result%10);//存储各个位 result /= 10; } while(!is_stack_empty(stack)) { result = stack_pop(stack); //获取各个位 printf("%d",result); //打印各个位 } }