栈与递归的应用(汉诺塔、数的阶乘)c语言版
前言
1、汉诺塔这个游戏是可以利用栈来实现相关步骤。
2、栈另一个非常重要的一个应用是在程序设计中实现递归。递归是指在定义自身的时候又出现了对自身的调用。递归又分为直接递归函数和间接递归函数。
一、相关介绍
1.汉诺塔游戏介绍:假设有三根针A、B、C,在A上有n个金片,从上到下叠放,且直径依次从小到大,(依次编号为1、2、3、——n),要求按下列规则将所有金片移至C针。
规则一:每次移动一个金片;
规则二:大金片不能叠在小金片上面;
规则三:金片临时置于B针。
当n=1,直接将A上的金片移到C上;
当n=2,将1号金片移到B针上,再将2号金片移到C针上,最后将1号金片从B移到C上;
当n=3,借助B针,依照n=2的规则,先将1、2号金片借助C针移到B针上,之后将3号金片移到C针上,再将B上的1、2号金片借助A针移到C针上。
以此类推
······
当n>1时,需要借助B针进行辅助,将n号之前的n-1个金片移到B上,接着将A上的第n号金片直接移到C上,最后将B上的n-1个金片借助A移到C上。
2、递归
(1)直接递归:一个函数在定义体内直接调用自己;
(2)间接递归:一个函数经过一系列的中间调用语句,通过其他函数间接的调用自己;
递归的特点:
(1)递归就是在函数或过程里调用自身;
(2)在使用递归策略时,必须包含一个明确的递归结束条件,称之为递归出口。
eg:求阶乘用递归时,递归结束条件为n=0时,此时递归调用结束。
二、代码实现
1.代码
汉诺塔代码如下:
#include<stdio.h>
void hanoi(int n,char X,char Y,char Z)
{
if(n==1)
{
printf("%c->%c\n",X,Z);
}
else
{
hanoi(n-1,X,Z,Y);
printf("%c->%c\n",X,Z);
hanoi(n-1,Y,X,Z);
}
}
void main()
{
int n;
printf("请输入金片数n:\n");
scanf("%d",&n);
hanoi(n,'A','B','C');
}
2、阶乘代码如下:
#include<stdio.h>
int fact(int n)
{
int s;
if(n==0) s=1;
else s=n*fact(n-1);
return s;
}
int main()
{
int m,f;
printf("输入要计算的阶乘数: ");
scanf("%d",&m);
f=fact(m);
printf("%d的阶乘为%d",m,f);
return 0;
}
2.示例
汉诺塔:
阶乘:
总结
以上就是今天要讲的内容,本文仅仅简单介绍了栈的两个应用,而合理使用栈能使我们快速便捷地处理相关问题。