一个常见的递归算法例子:
//斐波那契
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); //打印各个位
}
}