栈与递归的应用(汉诺塔、数的阶乘)c语言版

栈与递归的应用(汉诺塔、数的阶乘)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.示例

汉诺塔:


 阶乘:

 

总结

        以上就是今天要讲的内容,本文仅仅简单介绍了栈的两个应用,而合理使用栈能使我们快速便捷地处理相关问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值