1.概述
递归【这对你的编码能力是个质的飞跃,计算机特别适合用递归的思想来解决问题,但是我们人类用递归的思想来考虑问题就会感到十分困扰,这也是很多学过递归的人一直都搞不明白的地方!那是不是递归可以随便写,当然不是。递归的思想是软件思想的基本思想之一,在树和图论上面,几乎全是用递归来实现的,最简单,像求阶乘这种没有明确执行次数的问题,都是用递归来解决】
2.定义
一个函数自己直接或间接调用自己(一个函数调用另外一个函数和他调用自己是一模一样的,都是那三步,只不过在人看来有点诡异。)
3.使用条件
递归满足的三个条件:
1、递归必须得有一个明确的终止条件
2、该函数处理的数据规模必须在递减
3、这个转化必须是可解的。
4.循环和递归
理论上循环能解决的,肯定可以转化为递归,但是这个过程是复杂的数学转化过程,递归能解决不一定能转化为循环。
递归:
易于理解
速度慢
存储空间大
循环:
不易于理解
速度快
存储空间小
5.例子
主函数
#include<stdio.h>
#include<stdlib.h>
int fun(int);
int fun1(int);
void hannuota(int n, char A, char B, char C);
int main(void)
{
//------递归例子1-------
//printf("阶乘的结果:%d\n", fun(4));
//------递归例子2-------
//printf("求和的结果:%d\n", fun1(100));
//------递归例子汉诺塔------
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
int n;
printf("请输入汉诺塔移动的盘子数量\n");
scanf_s("%d", &n);
hannuota(n, ch1, ch2, ch3);
system("pause");
return 0;
}
1.求阶乘
int fun(int num)
{
int result = 0;
if (num == 1)
{
result=1;
return result;
}
else
{
result=fun(num - 1)*num;
return result;
}
}
------
2.(1+2+3+4+。。。+100)的和
int fun1(int num)
{
if (num == 1)
return 1;
else
return fun1(num - 1)+num;
}
3.汉诺塔
【汉诺塔】这不是线性递归,这是非线性递归!
n=1 1
n=2 3
n=3 7
………
………
n=64 2的64次方减1【这是个天文数字,就算世界上最快的计算机也解决不了,汉诺塔的负责度是2的n次方减1】问题很复杂,但真正解决问题的编码只有三句。
void hannuota(int n, char A, char B, char C)//函数的意思是把n个盘子从A借助B移动到C上
{
if (n == 1)
printf("将编号为%d的盘子直接从%c柱子移到到%c柱子\n",n,A,C);
else
{
hannuota(n - 1, A, C, B);
printf("将编号为%d的盘子直接从%c柱子移到到%c柱子\n", n, A, C);
hannuota(n - 1, B, A, C);
}
}
附图说明:
4.走迷宫(CS的实现)
6.递归的运用
- 树和森林就是以递归的方式定义的
- 树和图的很多算法都是以递归来实现的
- 很多数学公式就是以递归的方式定义的
- 斐波拉契序列 1 2 3 5 8 13 21 34。。。