C语言函数学习——递归经典

一、汉诺塔问题

/*汉诺塔是什么?
/*
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
*/ 

/*第一步:
		将
		把第n个模块,从塔1移动到塔3

第二步:
		把n-1个模块,从塔2移动到塔3
*/
//用递归解决汉诺塔问题:    
//定义 塔1:Tower1   塔2:Tower2  塔3:Tower3 

/*
#include <stdio.h>

int cnt;//计算步数 

void Remove(int n,char A,char B,char C)
{
	if (n == 1)
		printf("step %d: 塔%c --> 塔%c\n", cnt++, A, C);
	else
	{
		Remove(n - 1, A, C, B);
		printf("step %d: 塔%c --> 塔%c\n", cnt++, A, C);
		Remove(n - 1, B, A, C);
	}
}

int main()
{
	int n;
	cnt = 1;
	printf("请输入汉诺塔圆盘数量>:");
	scanf("%d", &n);
	Remove(n, 'A', 'B', 'C'); //圆盘数量 塔A, 塔B, 塔C
	return 0;
}
*/ 
 
#include <stdio.h>
void move(int n,char A,char B,char C);
int cnt=1;
void move(int n,char A,char B,char C) 
{
	if(n==1)			//最后一步(n步)就是把第一个柱子的圆盘放到最后一个柱子 
	{
		printf("第%d步:将一个圆盘从%c柱子->%c柱子\n",cnt++,A,C); 
	}
	else
	{
		move(n-1,A,C,B);										  //把A上n-1个盘子通过借助辅助塔(C塔)移到了B上
		printf("第%d步: 将一个圆盘从%c柱子->%c柱子\n",cnt++,A,C); //把最大的一个盘子由A移到C上去
		move(n-1,B,A,C);	                                      //把B上n-1个盘子通过借助辅助塔(A塔)移到了C上
	} 
} 


int main()
{ 
	int n = 0;
	char A = 'A';
	char B = 'B';
	char C = 'C';
	printf("请输入圆盘的个数:\n");
	scanf("%d",&n); 
	move(n,A,B,C);
	return 0;
}



二、青蛙跳台阶

//问题:
//有一只青蛙,一次可以跳一层台阶也可以跳两层台阶,问n层台阶共有多少种跳法?
/*
问题分析: 


1层	<| 跳1步        								1种                 
	
 	 | 跳1步->跳1步
2层	< 												2种 
	 | 跳2步
	 
	 
 	 | 跳1步->跳1步->跳1步
3层	<| 跳1步->跳2步									3种 
	 | 跳2步->跳1步
	 
	 | 跳1步->跳1步->跳1步->跳1步
 	 | 跳1步->跳1步->跳2步
4层	<| 跳1步->跳2步->跳1步			  				5种 
	 | 跳2步->跳1步->跳1步		
	 | 跳2步->跳2步
	 
	 
	 | 跳1步->跳1步->跳1步->跳1步->跳1步
	 | 跳1步->跳1步->跳1步->跳2步
 	 | 跳1步->跳1步->跳2步->跳1步
5层	<| 跳1步->跳2步->跳1步->跳1步					8种 
	 | 跳2步->跳1步->跳1步>跳1步
	 | 跳2步->跳1步->跳2步
 	 | 跳2步->跳2步->跳1步
 	 | 跳1步->跳2步->跳2步
 :
 :
 : 
 :	  
n层 											f(n)=f(n-1)+f(n-2) 种 
 

*/ 	    
#include<stdio.h> 
int Move(int n);


int main()
{
	int n = 0;
	printf("请输入有多少层台阶\n"); 
	scanf("%d",&n); 

	printf("小青蛙有%d种跳法",Move(n));
} 

int Move(int n)
{
	int cnt;//计数 
	
	if(n<=3)
	{	
	cnt = n; //台阶数在3层以内时, 多少层就有多少种跳法 
	}
	else 
	{
		cnt=Move(n-1)+Move(n-2);//台阶在3层以外, 跳的次数就等于前两次次数的和 
	}
	return cnt; 
}
//程序运行流程:  
/*
例如: 输入4
	n = 4 ;
	判断n >3 所以进else 
	cnt =Move(3)+Move(2)
	3 和 2 都在三层内
	所以 进入if,即层数就是跳法数
	cnt = 3+2 = 5;循环结束; 
	
	返回 5; 
	
	例如 输入5
	n = 5;
	进入第一层Move: 
	 
		判断 n>3 所以进else
		cnt = Move(4)+Move(3)
	
	>>>>执行递归: 
	
		进入第二层Move 
			Move(4):n>3 所以还是 进入else 即cnt = Move(3)+Move(2) 
				进入第三层Move
					Move(3) :n = 3  进入if 判断 满足if条件,所以 cnt = n  返回 3到上一层 即 第二层Move 
					Move(2) :n = 2  进入if 判断 满足if条件,所以 cnt = n  返回 2到上一层 即 第二层Move  
	 	回到第二次Move
		    Move(4) = 5 
			Move(3) :n = 3  进入if 判断 满足if条件,所以 cnt = n  返回 3 
	再次回到第一层Move:
		 	cnt = Move(4)+Move(3) =  5+ 3 = 8 即返回8到主函数 
	cnt = 5+3 = 8 
*/ 








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Remaimed

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值