递归复习提纲
递归的定义:
在定义一个过程或函数时,出现直接或者间接调用自己的成分,称之为递归
- 若直接调用自己,称之为直接递归
- 若间接调用自己,称之为间接递归
一般来说间接递归总可以转化为直接递归
尾递归:递归函数中递归调用语句是最后一条执行语句
- 尾递归算法可以用循环语句转化为等价的非递归算法
- 非尾递归算法可以通过栈来转化为等价的非递归算法(递归对问题顺序的处理,是遵循了先入后出的规律)
何时使用递归:
- 定义是递归的
- Fibonacci数列
- 正整数的定义
- ……
- 数据结构是递归的
- 不带头节点的单链表
- 树
- ……
- 问题的求解方法是递归的
- Hanoi问题
- ……
递归模型:递归模型是算法的抽象,反映一个递归问题的递归结构
- 递归模型由递归出口和递归体两部分组成
- 递归出口确定递归的结束
- 递归体确定求解时的递推关系式
递归步骤
- 把一个大问题分解为一个或者几个类似的小问题
- 小问题继续分解
- 直到每个小问题可解
这里的相似是指求解过程和环境都相似
递归的执行过程由分解和求值两部分组成
- 分解可以看成是入栈的过程
- 求值可以看成是到达递归出口后依次出栈的过程
典型例题
- 假设a数组含有1,2,3,…,n,求其全排列
分析过程略
# include<stdio.h>
void swap(int &a, int &b);
void perm(int a[], int n, int k);
int main()
{
int a[] = {1,2,3};
perm(a, 3, 2);
return 0;
}
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
void perm(int a[], int n, int k)
{
if (k == 0)
{
for (int i = 0; i < n; i++) printf("%d",a[i]);
printf("\n");
}
else
{
for (int i = 0; i <= k; i++)
{
swap(a[i], a[k]);
perm(a, n, k-1);
swap(a[i], a[k]);
}
}
}