数组求和:递归版、尾递归版、迭代版(C++语言实现)
说明:以下代码仅大体表达核心思路,未对特殊情况进行判断和处理
递归版实现:
按照尾递归的定义,该实现不是尾递归版本,但在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; }