转载请注明出处,谢谢。
本博客主要介绍数组求和的三种方法,循环、递归与折半法。如果有不足之处,欢迎指教。
一、循环
#include <iostream>
using namespace std;
int main(){
int k;
cin >> k;
int a[100];
int sum=0;
for(int i = 0; i < k; i++){
cin >> a[i];
sum+=a[i];
}
cout << sum <<endl;
return 0;
}
二、递归
#include <iostream>
using namespace std;
int digui(int a[], int size, int begin){
if(begin >= size) return 0;
int x = digui(a, size, begin + 1);
return x + a[begin];
}
int main(){
int k;
cin >> k;
int a[100];
for(int i = 0; i < k; i++){
cin >> a[i];
}
cout << digui(a, k, 0) << endl;
return 0;
}
三、折半法
#include <iostream>
using namespace std;
/*两个if(递归出口)的举例解释*/
/*
如数组{1,2},mid=(0+1)/2=0, 即mid=left,此时需返回这两个值的和;
如数组{1} ,此时left=right,需返回该值,因为这时的a[left] 与a[right]是同一个值。
*/
int digui(int a[], int left, int right){
if(left == right) //参考举例解释
return a[left];
int mid = (left + right) / 2; //mid记录数组中间位置 ,用于折半
if(mid == left) //参考举例解释
return a[left] + a[right];
return digui(a, left, mid - 1) + digui(a, mid, right); //分别表示左区间(左闭右开),右区间(双闭)
}
int main(){
int k;
cin >> k; //输入数组元素个数
int a[100];
for(int i = 0; i < k; i++){
cin >> a[i]; //输入数组值
}
int left = 0,right = k-1; //left记录数组首元素位置,right记录末位置
cout << digui(a, left, right) << endl;
return 0;
}
运行截图