C和C指针小记(十一)-递归和迭代优化

1、递归

C通过运行时堆栈支持递归函数的实现.
递归函数就是直接或间接调用自身的函数.
一个小例子:

/**
 使用递归将整型转换为ascii字符

 @param value 整型数
 */
void binary2ascii(unsigned int value) {
    unsigned int quotient;
    quotient = value / 10;
    if (quotient != 0) {
        binary2ascii(quotient);
    }
    putchar(value % 10 + '0');
}

2、两个递归运用和用迭代优化的例子

尾递归:递归调用出现在函数的尾部,并且之后不再执行任何任务
尾递归可以方便的转换为迭代.由于递归是非常耗费内存的(每次函数调用都会在内存中分配空间),内存频繁的分配回收严重影响程序的执行效率.


/**
 递归计算阶乘

 @param n 整数n
 @return 阶乘
 */
long factorial(unsigned int n){
    if (n <= 0) {
        return 1;
    }else{
        return n * factorial(n - 1);
    }
}


/**
 迭代计算阶乘

 @param n 整数n
 @return 阶乘
 */
long factorial_iteria(int n){
    int result = 1;
    while (n > 1) {
        result *= n;
        n -= 1;
    }
    return result;
}



/**
 递归计算斐波那契数
 效率非常低:计算fibonacci(10)时,fibonacci(3)重复计算了21次,计算fibonacci(30)时,fibonacci(3)计算了317811次
 @param n 整数n
 @return n的斐波那契数
 */
long fibonacci(int n){
    if (n <= 2) {
        return 1;
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
}


/**
 迭代求斐波那契数列
 
 @param n 整数n
 @return n的斐波那契数
 */
long fibonacci_iteral(int n){
    long result;
    long previous_result;
    long next_older_result;
    result = previous_result = 1;
    while (n > 2) {
        n -= 1;
        next_older_result = previous_result;
        previous_result = result;
        result = previous_result + next_older_result;
    }
    return result;
}


posted @ 2019-02-20 17:49  wjwdive  阅读(237)  评论(0编辑  收藏  举报