#递推&&递归算法(Hanoi问题)

博客介绍了递推的定义,即数的序列中Hn与前面某些项的关系式子。阐述了解决递推问题的一般步骤,包括建立递推关系式、确定边界条件和递推求解。还列举了递推的应用分类,如一般递推问题、组合计数类问题等,并以楼梯问题和汉诺塔问题为例进行说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*何为递推?
给定一个数的序列H0,H1,…,Hn,…若存在整数n0,使得当n>n0时,可以用等号(或大于号、小于号)将Hn与其前面的某些项Hi(0<i<n)联系起来,这样的式子就叫做递推关系。

解决递推问题的一般步骤
1.建立递推关系式
2.确定边界条件
3.递推求解

递推的应用分类
1.一般递推问题
2.组合计数类问题
3.*一类博弈问题的求解
4.*动态规划问题的递推关系
ps:正在逐渐完善ing

递推的应用(一般递推问题)
Question.1上楼梯问题
题面:有一楼梯共M级,刚开始你在第一级,若每次只能跨上一级或两级,要走上M级,共有多少种走法?

Analysis

楼梯阶数方法
11
22
33
45
58
613
721

由题目可知,每次可以上一阶或两阶,由此可知,第n阶楼梯可以从第n-1阶楼梯和第n-2阶楼梯一步迈上来。如果走到n-1阶有a种走法,走上n-2阶有b种走法,那么,第n阶就有a+b种走法。

运用C++代码表示如下:

#include<iostream>
using namespace std;
int main()
{
	long long a[10];
	a[1]=1;a[2]=2;
	for(int i=3;i<10;i++)
	{
		a[i]=a[i-1]+a[i-2];
		cout<<i<<" "<<a[i]<<endl;	
	}	
	return 0;
}

除此之外较难的还有“汉诺塔问题”,有兴趣的可以去了解一下,未来我会专门写一个专题关于Hanoi塔的。
在这里插入图片描述

Hanoi代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
void Hanoi(int n,char src,char mid,char dest)
//有n个盘子,src为原位置,mid为中转位置,dest为目标位置
{
 if(n==1){
  cout<<src<<"->"<<dest<<endl;//只剩下一个盘子时的移动
  return;
 }
 Hanoi(n-1,src,dest,mid);//把n-1个盘子从src移动到mid
 cout<<src<<"->"<<dest<<endl;//把余下的那一个盘子从src移动到dest
 Hanoi(n-1,mid,src,dest);//把mid上的n-1个帕子移动到dest
 return ;
}
int main()
{
 int n;
 cin>>n;
 Hanoi(n,'A','B','C');
 return 0;
}

作者碎碎念:
其实理解Hanoi算法还是非常简单的,这个是递归算法的入门,但是很多新手ACMer有点难懂代码含义。说白了,就是把一个n的东西分拆成n-1,再把n-1分拆成n-2…依次处理,最后到1的时候return。

为了方便理解,可以用数据结构中“栈”的思想,手工分割解法,以3个盘子为例。

第一栈第二栈
2ACB
1ABC
3ABC2BAC

以上是第三栈到第二栈的手工分割
第二栈又可分第一栈,这里不多演示了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值