数据结构:递归
1.定义
一个函数直接或间接的调用自己
2.举例
1)求阶乘
2)1+2+3+4+……+10
3)汉诺塔
4)走迷宫
(1)(2)求阶乘,求累加
a.循环解决
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.循环和递归区别
递归
易于理解
速度慢
存储空间大
循环
不易理解
速度快
存储空间小
posted on 2019-05-30 14:11 zhaoy_shine 阅读(140) 评论(0) 编辑 收藏 举报