首页 > 其他分享 >[PTA]7-8 汉诺塔问题(Hanoi) 7-9 建国的数学难题 7-10 用递归法求解Fibonacci数列

[PTA]7-8 汉诺塔问题(Hanoi) 7-9 建国的数学难题 7-10 用递归法求解Fibonacci数列

时间:2024-09-22 14:55:22浏览次数:11  
标签:10 return 输出 int 样例 Hanoi 汉诺塔 Fibonacci 输入

[PTA]7-8 汉诺塔问题(Hanoi) 7-9 建国的数学难题 7-10 用递归法求解Fibonacci数列

描述:
一、汉诺塔问题

有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。

问:如何移?最少要移动多少次?

汉诺塔示意图如下:
在这里插入图片描述
二、故事由来

法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2f(k)+1。此后不难证明f(n)=2n-1。n=64时, 假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下: 18446744073709551615秒 这表明移完这些金片需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

三、解法

解法的基本思想是递归。假设有A、B、C三个塔,A塔有N块盘,目标是把这些盘全部移到C塔。那么先把A塔顶部的N-1块盘移动到B塔,再把A塔剩下的大盘移到C,最后把B塔的N-1块盘移到C。 每次移动多于一块盘时,则再次使用上述算法来移动。

输入格式:

输入为一个整数后面跟三个单字符字符串。
整数为盘子的数目,后三个字符表示三个杆子的编号。

输出格式:

输出每一步移动盘子的记录。一次移动一行。
每次移动的记录为例如3:a->b 的形式,即把编号为3的盘子从a杆移至b杆。
我们约定圆盘从小到大编号为1, 2, …n。即最上面那个最小的圆盘编号为1,最下面最大的圆盘编号为n。

输入样例:

3 a b c

输出样例:

1:a->c
2:a->b
1:c->b
3:a->c
1:b->a
2:b->c
1:a->c

代码

#include <stdio.h>

void move(int n,char a,char c){
	printf("%d:%c->%c\n",n,a,c);
}
void hnt(int n,char a,char b,char c){
	if(n==1)move(n,a,c);
	else{
		hnt(n-1,a,c,b);
		move(n,a,c);
		hnt(n-1,b,a,c);
	}
}
int main(){
    int n;
    scanf("%d",&n);
    hnt(n,'a','b','c');
    return 0;
}

7-9 建国的数学难题

众所周知,建国是一个数学天才,但是今天他被下面这道题考到了,你能帮建国解决这个难题吗?

f(1) = k

f(2) = f(1) + 1

f(3) = f(2) + 1 + 2

f(n) = f(n-1) + (1 + 2 + … + n-1)

输入格式:

第一行输出一个整数T,表示样例数。(1 <= T <= 100)

每个样例占一行,输入两个整数n,k。(0 < n, k <= 1000) 。

输出格式:

每个样例输出一个整数表示f(n)。

输入样例:

2
1 1
2 3

输出样例:

1
4

代码

#include <stdio.h>
 
int T, n, k;
 
int f2(int n){
    if(n==1)
        return 0;
    return f2(n-1)+n-1;
}
 
int f1(int n){
    if(n==1)
        return k;
    return f1(n-1)+f2(n-1)+n-1;//或者写成f1(n-1)+f2(n)
}
 
int main(){
    scanf("%d", &T);
    while(T--){
        scanf("%d%d", &n, &k);
        printf("%d\n", f1(n));
    }
    return 0;
}

7-10 用递归法求解Fibonacci数列

这是一个编程题模板。

已知斐波那契数列公式如下:
F(n)=F(n−1)+F(n−2),(n>2);
F(1)=1;F(2)=1。

输入格式:

输入一个正整数n(1<=n<=50)。

输出格式:

输出该正整数n对应的斐波那契数列的F(n)。
如果输入的n<1或者n>50,输出"Wrong Input!"

输入样例:

在这里给出一组输入。例如:

2

输出样例:

在这里给出相应的输出。例如:

F(2)=1

输入样例:

在这里给出一组输入。例如:

3

输出样例:

在这里给出相应的输出。例如:

F(3)=2

输入样例:

在这里给出一组输入。例如:

-7

输出样例:

在这里给出相应的输出。例如:

Wrong Input!

代码

#include <stdio.h>

int Fibonacci(int n){    //递归求第n项的值
    if(n == 0 || n == 1)
        return n;
    else
        return Fibonacci(n-1) + Fibonacci(n-2);
}

int main(){

    int n;
    scanf("%d", &n);
    
    if(n < 1 || n > 50){    //输入错误
        printf("Wrong Input!");
    }else{
        printf("F(%d)=%d\n", n, Fibonacci(n));
    }

    return 0;
}


标签:10,return,输出,int,样例,Hanoi,汉诺塔,Fibonacci,输入
From: https://blog.csdn.net/2201_75443644/article/details/142418763

相关文章

  • Spire.PDF for .NET 10.9.0
    Spire.PDFfor.NETisaprofessionalPDFAPIappliedtocreating,writing,editing,handlingandreadingPDFfileswithoutanyexternaldependencieswithin.NET(C#,VB.NET,ASP.NET,.NETCore,.NET5.0,.NET6.0,.NET7.0,MonoAndroidandXamarin.iOS)......
  • win10x64位+nmake编译geos3.7.1
    说明:使用nmake进行编译,最新的geos3.13似乎已经不能用nmake进行编译了,不过3.7.1已经够用了。1、解压geos-3.7.1,定位到根目录下的namke.opt文件,这个文件控制着nmake编译的一些参数。2、打开nmake.opt,找到如下片段:############################################################......
  • P1056 [NOIP2008 普及组] 排座椅(模拟)
    1.用x,y数组存放切了几对学生,用数组的下标记录切的位置2.按照题目要求k和l依次取出最大的数组的值,并将其变为-1,再次循环取出第二大的值,之后所有下标为-1的的下标就是切的学生对多的3.切的意思是把两个学生分开#include<bits/stdc++.h>usingnamespacestd;intx[1005],......
  • Leetcode 1041. 困于环中的机器人
    1.题目基本信息1.1.题目描述在无限的平面上,机器人最初位于(0,0)处,面朝北方。注意:北方向是y轴的正方向。南方向是y轴的负方向。东方向是x轴的正方向。西方向是x轴的负方向。机器人可以接受下列三条指令之一:“G”:直走1个单位“L”:左转90度“R”......
  • 游戏中的状态控制 适合于全部游戏 scratch 20240922_111017
    完整的游戏游戏封面游戏进行游戏暂停游戏结束预设状态值0欢迎界面1游戏进行2游戏暂停3游戏结束需要定义变量来适时的改变他们变量使用英文stat背景代码在背景的代码里定义了【欢迎画面】的自制积木实现游戏的状态值的初始化等待玩家输入如果玩家输入了1那么......
  • 【LeetCode Hot 100】15. 三数之和
    题目描述回忆一下之前做过的两数之和,用的是哈希表存储已经遍历过的元素。但是本题要求返回值中不能有重复元素,因此需要去重,强行用哈希表的话,去重操作会很复杂。我们可以通过哪些方法来保证返回的数组中不包含重复的三元组?先将整个数组进行排序,可以保证答案数组中有\((a,b,c)\)......
  • 【信号传输】DMA传输只能收到一半数据,发送123456 只能收到 123, 发送abcd只能收到ab,缓
    系列文章目录1.元件基础2.电路设计3.PCB设计4.元件焊接5.板子调试6.程序设计7.算法学习8.编写exe9.检测标准10.项目举例11.职业规划文章目录方案一、改DMA中断方案二、改数据类型方案三、改数据长度后记方案一、改DMA中断每个DMA通道都可以在DMA传......
  • 新鲜的Win11/10镜像,全系列下载!
    Windows每个月都来一次例行更新,大吉大利今晚装机!2024年9月份ISO镜像,来咯~我们不生产系统,我们只是大自然微软的搬运工本文提供Windows11、Windows10、WindowsServer2022、Server23H2包含简体中文/繁体中文/英文语言,总共22个ISO镜像。微软对不同版本提供的生命周期有所区......
  • 求1000以内所有恰好能分解成10组两个素数之和
    要求根据哥德巴赫猜想,任意一个大偶数都可以分解为两个素数之和。但许多偶数分解为两个素数之和并不是唯一的。请编写函数fun,其功能是:求1000(不包括1000)以内的所有恰好能分解成10组两个素数之和(5+109和109+5被认为是同一组)的偶并依次存入数组a中并在屏幕上打印出来,打印时......
  • PAT甲级-1086 Tree Traversals Again
    题目 题目大意题目给出二叉树的节点个数,并给出用栈遍历树的过程。要求输出树的后序遍历,不能有多余空格。思路可以看出,栈遍历输出的是树的中序遍历,而依次push进栈的是先序遍历的顺序。题目要求后序,即已知先序和中序遍历,求后序遍历。可以先依次遍历先序,例如从先序第一个......