往期文章
1 绪论-数据结构的基本概念
2 绪论-算法
3 线性表-顺序表和链式表概念及其代码实现
4 查找-顺序+折半+索引+哈希
5 插入排序-希尔排序-选择排序-冒泡排序-快速排序-基数排序-外部排序-归并排序
直接递归调用
void A()
{
...
A();
...
}
间接调用递归
void B()
{
...
C();
...
}
void C()
{
...
B();
...
}
尾递归都能转换成非递归的写法
尾递归是指递归只是出现在return的时候
int f(int n)
{
if(n<=1)
return n;//结束条件
else
return(f(n-1)+f(n-2));//递归方程
}
非递归求解
int f(int n)
{
int pre,now,next,j;
if(n<=1)return(n);
else
{
pre=0;now=1;
for(j=2;j<=n;j++)
{
next=pre+now;
pre=now;
now=next
}
return(next);
}
}
如果一个字符串从左向右读和从右向左读完全相同(不区分大小写),则这个字符串称为回文串(palindrome),例如“noon”、“madam”等都是回文串。
递归求解
bool palindrome(string &s,unsigned h,unsigned t)
{
if (h>=t) return 1;
if(tolower(s[h])==tolower(s[t]))
return palindrome(s,h+1,t-1);
else
return 0;
}
非递归求解
bool palindrome(string &s)
{
int h=0,t=strlen(s)-1;
while(h<=t)
{
if(s[h]!=s[t])return 0;
h++;t--;
}
return 1;
}
注意看注释
{
if ( | P | <= n0) adhoc(P); //解决小规模的问题
divide P into smaller subinstances P1,P2,...,Pk;//分解问题
for (i=1,i<=k,i++)
yi=divide-and-conquer(Pi); //递归的解各子问题
return merge(y1,...,yk); //将各子问题的解合并为原问题的解
}
前提说明(忽略细节 如果后期发现细节很重要再加入进来)
T(n) 由两部分组成 一个是 每个小部分的计算时间之和 + 分解时间和解和并的时间f(n)
假设有n个数据a[n],要把这n个数据的全排列都打印出来,考虑递归方法PrintPermutation。
第一个位置的元素可能是这n个元素的任意一个,可以采用swap,将第一个位置与其他位置的交换,就可以得到第一个位置元素不同的情况,而余下的递归调用打印全排列函数PrintPermutation完成。但要注意还应该交换回去,便于后面的正确处理。
递归函数内部,又会当前的第一个位置(第2个位置)的元素与余下n-2个位置元素交换;里面又会当前的第一个位置(第3个位置)的元素与余下n-3个位置元素交换;……;最后第n个位置的元素,就表示前面的n-1个位置已经处理了,就可以打印了。所以递归打印条件是位置k=n,这个也是递归出口
a[] 存放数据 k表示第一个交换的位置,一般为1,n便是数据的个数。
void PrintPermutation(int a[], int k, int n){
if (k == n){
for (int i = 1; i < n + 1; ++i){
cout << a[i] << " ";
}
cout << endl;
return;
}
else{
for (int i = k; i < n+1; ++i){
Swap(a[k], a[i]);
PrintPermutation(a, k + 1, n);
Swap(a[k], a[i]);
}
}
}
int main()
{
int *a, len;
cout << "len:" << endl;
cin >> len;
a = new int[len+1];
if (!a)return -1;
for (int i = 1; i < len + 1; ++i)
a[i] = i;
PrintPermutation(a, 1, len);
}
如果有遗漏和错误的地方,欢迎指出。