试题 基础练习 FJ的字符串(汉诺塔)——递归

对于递归的理解就是放弃。

放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件。

文章目录

  • 对于递归的理解就是放弃。
  • 放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件。
    • 汉诺塔
    • H - 汉诺塔V HDU - 1995
    • 试题 基础练习 FJ的字符串

汉诺塔

1. 对于汉诺塔,给了k层的碟 和三个分别为a、b、c的柱子,碟都在a上。
我们如何解决问题的呢?我们是将k-1层从a移动到b上,再将第k个碟子由a移动到c这个柱子上,再将k-1层移动到k的上面。
至于k-1层如何移动我们不需要考虑。
2. 对于这两层的关系,我们可以知道k层总的移动数就是k-1层移动的数量+第k层从a到c的数量(也就是1)+k-1层移动的数量。
3. 同理,k-1层也就一样啊,也就是k-2层移动的数量加上第k-1层从a移动到c的数量再加上k-2层搬到第k-1层移动的数量。至于k-1层如何,我们还是不用考虑

**4.**最后到了递归终结的条件了,就是只有一层的时候,直接就是1

#include
using namespace std;
int n;
solve(int x,char a,char b,char c){//a是所在的柱子,b是中间的柱子,c是要移动到的柱子
	if(x==1){//如果就一个碟子的话,就直接移动到c柱子
		printf("%c->%c\n",a,c);
	}
	else{
		solve(x-1,a,c,b);//x-1层的碟子先从a移动到b柱子上
		solve(1,a,b,c);//第k层柱子从a移动到c柱子上
		solve(x-1,b,a,c);//x-1层碟子再从b移动到c柱子上(也就是第k层上)
	}
}
int main(){
	scanf("%d",&n);
	solve(n,'A','B','C');
}

H - 汉诺塔V HDU - 1995

传送门
题目大意是:要移动x层碟子,第k层移动了多少步
一层:第一层 移动1步
二层:第一层 移动2步
第二层 移动1步
三层:第一层 移动4步
第二层 移动2步
第三层 移动1步

从这里就能发现规律,2^(x-k),但用pow肯定会爆

#include
using namespace std;
typedef long long ll;
int n,x,k;
ll solve(int a,int b){
	if(a==b){
		return 1;
	}
	return 2*solve(a-1,b);
}
int main(){
	scanf("%d",&n);
	while(n--){
		scanf("%d%d",&x,&k);
		printf("%lld\n",solve(x,k));
	}
	return 0;
}

试题 基础练习 FJ的字符串

传送门
这道题让我对递归进一步加深。

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
  FJ在沙盘上写了这样一些字符串:
  A1 = “A”
  A2 = “ABA”
  A3 = “ABACABA”
  A4 = “ABACABADABACABA”
  … …
  你能找出其中的规律并写所有的数列AN吗?
输入格式
  仅有一个数:N ≤ 26。
输出格式
  请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例输入
3
样例输出
ABACABA

题解:这道题跟汉诺塔相同。
A4=A3+1+A3

Ak=Ak-1+1+Ak-1
递归终止 A

#include
using namespace std;
int n;
void solve(int x){
	if(x==1){
		printf("A");
	}
	else{
		solve(x-1);
		printf("%c",'A'+x-1);
		solve(x-1);
	}
}
int main(){
	scanf("%d",&n);
	solve(n);
}

你可能感兴趣的:(蓝桥杯,DP)