定义:一个函数直接或者间接调用其本身。
递归要满足的条件:
1. 递归必须有一个明确的终止条件
2. 该函数所处理的数据规模必须在递减
3. 这个转化必须是可解的
循环(迭代)和递归的关系:
什么时候用循环?什么时候用递归?什么是尾递归?
任何一个迭代的例子都有它的递归表示法,反之亦然
分治思想:
各个小模块和大的模块结构相同。
折半查找:
减少查找序列的长度,分而治之进行关键字的查找。
举例:
1. 求阶乘
if(1==n)
return 1;
else
return n*f(n-1);
2. 1+2+3+…+100的和(与上面类似)
3. 汉诺塔
#include <stdio.h>
#include <iostream>
using namespace std;
void hannuota(int n, char A, char B, char C)// 只是形参 不是具体的ABC三个柱子
{
//伪算法
//如果是1个盘子
//直接将A柱子上的盘子从A移到C
//最后将B柱子上的n-1个盘子借助A移到C
if (1 == n)
{
printf("将编号为%d的盘子直接从%c柱子移到%c柱子", n, A, C);
}
else
{
hannuota(n - 1, A, C, B);
printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n", n, A, C);
hannuota(n - 1, B, A, C);
printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n", n, A, C);
}
}
递归的应用
树和森林就是以递归的方式定义的
树和图的很多算法都是以递归来实现的
很多数学公式就是以递归的方式来实现的
斐波拉契序列:1 2 3 5 8 3 21 34…
线性结构总复习
逻辑结构:线性—-数组和链表
栈和队列是一种特殊的线性结构
非线性:树和图
物理结构