递归写法转成迭代

一个常见的递归算法例子:

//斐波那契
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);       //打印各个位
    }
}


猜你喜欢

转载自blog.csdn.net/xmzzy2012/article/details/80504858