?递归(recursive)是一种基本而典型的算法设计模式,是函数和过程调用的一种特殊形式,即允许函数和过程进行自我调用。下面学习线性递归(linear recursion):
#include <iostream>
using namespace std;
//线性递归:求和
int sum(int* array, int size)
{
if (1>size) //平凡情况,递归基
{
return 0;
}
else
{
return sum(array, size-1) + array[size-1];
}
}
//数组倒置
//递归算法
void reverse(int* array, int lo, int hi)
{
if (lo < hi)
{
swap(array[lo], array[hi]);
reverse(array, ++lo, --hi);
}
}
//尾递归消除
void reverse0(int* array, int lo, int hi)
{
next: //算法起始位置,添加跳转标志
if (lo < hi)
{
swap(array[lo], array[hi]);
lo++;
hi--;
goto next; //跳转到算法体的起始位置,进行迭代
}
}
//常规迭代版
void reverse1(int* array, int lo, int hi)
{
while (lo < hi)
{
swap(array[lo++], array[hi--]);
}
}
void reverse(int* array, int size)
{
reverse(array, 0, size-1);
}
int main (int argc, char** argv)
{
int array[10] = {0,1,2,3,4,5,6,7,8,9};
cout << sum(array, sizeof(array)/sizeof(int)) << endl;
reverse(array, sizeof(array)/sizeof(int));
//打印数组
for (int x : array)
{
cout << x << endl;
}
return 0;
}
重点强调:
1、在进行数组倒置时,使用了三种不同的函数进行完成,方法一为递归运算,方法二采用了消除尾递归使用迭代的方法进行运算,但是使用了goto关键字,在C++中goto语句有悖于结构化程序设计的原则,最好尽力回避使用;方法三使用while语句实现,避免goto语句;
2、程序中对数组进行操作时,使用了操作符++,--,需要注意使用方法,否则会出现数组下标越界,程序报错Segmentation fault (core dumped);a++、a--为后缀,返回a变化前的值;++a、--a为前缀,返回a变化后的值,特别注意作为函数实参的使用。
|