数列求和的线性递归实现和二分递归实现
标签(空格分隔): 数据结构 算法
以前上C程序设计时,递归就搞得糊里糊涂的,甚至连最简单的一个青蛙跳问题都做不出来。过了几个月了,因为学习数据结构重新学习了一下,归纳了一下如何写出一个递归程序。
递归分为好几种模式,这里先介绍线性递归和二分递归。以对一个整型数列求和为例。先上代码。假设最常用的设加和器循环累加的方法是朴素法。
//递归实现数组求和
#include <iostream>
#define N 1005
using namespace std;
int s1,s2;
int dichotomysum(int a[],int lo,int hi);
int elasticsum(int a[],int lo,int hi);
int main() {
int a[N];
for (int i=0;i<20;i++) a[i]=i;
s1=dichotomysum(a,0,19);
s2=elasticsum(a,0,19);
cout << s1 <<endl;
cout << s2 <<endl;
return 0;
}
//此为二分递归
int dichotomysum(int a[],int lo,int hi) {
int mid=(lo+hi)/2;
if (lo>=hi) //平凡条件
return a[mid];
else //一般情况,递归形式下的操作
return dichotomysum(a,lo,mid)+dichotomysum(a,mid+1,hi);
}
//此为线性递归
int elasticsum(int a[],int lo,int hi) {
if (lo>hi)
return 0;
else
return elasticsum(a,lo+1,hi)+a[lo];
return 0;
}
线性递归的加和方式仍然像朴素方法一样,看似没有循环,其实循环靠递归实现。实现它的操作有:1.平凡条件。就是返回一个平凡值的条件,就像边界条件一样。2.一般操作。就是实现累和过程的实际操作。3.相通的参数设置。函数声明时的形式参数和在函数体内调用时的函数参数在逻辑上相通,使函数能通过递归调用完成累和。
二分递归的实现思想略有不同。对每一个大区间折半,然后对每一个小区间求和;对于每一个小区间,继续该操作,直到区间内只有一个元素,就返回这个元素。显然,该算法也包括1.平凡条件。2.一般操作。3.相通的参数设置。这是我认为的递归算法设置中的重点。