說明:以下代碼僅大體表達核心思路,未對特殊情況進行判斷和處理
遞歸版實現:
按照尾遞歸的定義,該實現不是尾遞歸版本,但在GCC編譯器中使用-O1選項啟用優化也可以獲得類似尾遞歸優化的效果(Mac OS平台)。
#include <iostream> using namespace std; long sum(int array[], unsigned length) { if (length < 1) { return 0; } return array[length - 1] + sum(array, length - 1); } int main() { int size = 190000, array[size]; for (int i = 1; i <= size; ++i) { array[i - 1] = i; } cout << sum(array, size) << endl; }
尾遞歸版實現:
求和sum函數使用了重載,入口重載函數屏蔽了實際重載函數的參數細節,使得調用者只需要使用入口函數,並給入口函數數組及其長度即可。
尾遞歸版本並不會解決棧溢出問題,需要進行優化后才不會出現棧溢出問題,因此需要在GCC編譯器中使用-O1選項啟用優化來編譯解決。
#include <iostream> using namespace std; //實際尾遞歸重載函數 long sum(int array[], long result, unsigned length) { if (length > 0) { result += array[length - 1]; return sum(array, result, length - 1); } return result; } //入口重載函數 long sum(int array[], unsigned length) { return sum(array, 0, length); } int main() { //定義大小為1234567的數組 int size = 1234567, array[size]; //填充數組 for (int i = 1; i <= size; ++i) { array[i - 1] = i; } //數組求和並輸出 cout << sum(array, size) << endl; }
迭代版:
#include <iostream> using namespace std; long sum(int array[], unsigned length) { long sum = 0; while (length > 0) { sum += array[--length]; } return sum; } int main() { int size = 190000, array[size]; for (int i = 1; i <= size; ++i) { array[i - 1] = i; } cout << sum(array, size) << endl; }