C和C指針小記(十一)-遞歸和叠代優化
阿新 • • 發佈:2019-02-20
整數 叠代 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指針小記(十一)-遞歸和叠代優化