1. 程式人生 > >C和C指針小記(十一)-遞歸和叠代優化

C和C指針小記(十一)-遞歸和叠代優化

整數 叠代 ram result 遞歸函數 自身 函數調用 遞歸 cci

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;
}

C和C指針小記(十一)-遞歸和叠代優化