1.定义算法
一个函数直接或间接的调用本身函数
2.举例blog
1)求阶乘递归
2)1+2+3+4+……+10原理
3)汉诺塔循环
4)走迷宫im
(1)(2)求阶乘,求累加db
a.循环解决img
int main()
{
int val;
int i, mult = 1;
printf("请输入一个数字:");
printf("val = ");
scanf("%d", &val);
for (i=1; i<=val; i++)
{
mult = mult * i;
}
printf("%d的阶乘是%d",val, mult);
return 0;
}移动
b.递归解决
//假定n的值是1或者大于1的值
long f(long n)
{
if (1 == n)
{
return 1;
}
else
{
return f(n-1) * n; //若是求的是累加 则return f(n-1) + n
}
}
int main()
{
int n;
printf("请输入一个数字:");
printf("n = ");
scanf("%d", &n);
printf("%d的阶乘是%d",n, f(n));
return 0;
}
(3)汉诺塔
伪算法
先把A柱子上的前n-1个盘子从A借助C移到B
将A柱子上的第n个盘子直接移到C
再将B柱子上的n-1个盘子借助A移到C
代码实现
void hanoi(int n, char A, char B, char C)
{
/*
次数为2的n次方减1次
若是是一个盘子
直接将A柱子上的盘子移动到C柱子上
否者
先将A柱子上的n-1个盘子借助C移动到B柱子
A B C
n-1 -> ->n-1
n-1 <-n-1
n-1-> n-1
再将A柱子上的盘子从A移到C
A C
结果第n个 -> 第n个
最后将B柱子上的n-1个盘子借助A移到C
A B C
n-1 <-n-1
n-1 ->n-1
n-1 ->n-1
*/
if (1 == n)
{
printf("将编号为%d的盘子直接从%c柱子移动到%c柱子\n",n, A, C);
}
else
{
hanoi(n-1, A, C, B);
printf("将编号为%d的盘子直接从%c柱子移动到%c柱子\n",n, A, C);
hanoi(n-1, B, A, C);
}
}
int main()
{
int n;
printf("请输入要移动盘子的个数:");
scanf("%d",&n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
3.原理
间接调用
f()调用g(),g()调用k()
本身调用
f(n)调用f(n-1),f(n-1)调用f(n-2),一直到没法调用为止
4.循环和递归区别
递归
易于理解
速度慢
存储空间大
循环
不易理解
速度快
存储空间小