递归:
定义:有关函数自己直接或间接调用自己
递归要满足的三个条件:1、必须有一个明确的终值条件
2、该函数所处理的数据规模在递减
3、这个转化必须是可解的
循环和递归:所有循环可以解决的递归也可以,but反过来不行。
递归:易理解, 速度慢,存储空间大
循环:不易理解,速度快,存储空间小
举例:1、求阶乘
2、求1+2+3+4+。。。+100
3、汉诺塔
4、走迷宫
递归的应用:1、树和森林就算以递归的方式定义的
2、树和图的好多算法都是以递归来实现的
3、好多数学公式就是以递归的方式定义的:eg 斐波拉契序列 1、2、3、5、8、 13、21、34......
void f(int n)
{
if(n == 1)
printf("哈哈\n");
else
f(n-1);
}
当n=0时,不会输出哈哈。n=else;输出一个哈哈。
//假定n的值时1或者大于1的值(求阶乘)
long f(long n)
{
if(1 == n);
return 1;
else
return f(n-1)*n; //求和只需要把 * 改成+
}
汉诺塔:
if(n>1)
{
先把A柱子上的前n-1个盘子借助C移到B,
将A柱子上的第n个盘子直接移到C,
再将B柱子上的n-1个盘子借助A直接移到C,
}
以此类推,再将B上的n-2个借助C移到A,将第n-1个直接移到C
问题:怎么将前n-1移到B。
#include<stdio.h>
void hannuota(int n, char A, char B, char C)
{
if(1 == n)
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);
}
}
int main(void)
{
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
int n;
printf("please input the amount of plants:");
scanf("%d", &n);
hannuota(n,'A','B','C');
return 0;
}
注:n=1, 1次
n=2 3次
n=3 7次
。。。
n=64 2^64-1(这是一个天文数字,就算世界上最快的计算机也解决不了)