汉诺塔问题(C语言)

news/2024/7/5 1:42:24

1.代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int func2(int n)
{
	if (n == 1)
	{
		return 1;
	}
	else if (n == 2)
	{
		return 3;
	}
	return 2 * func2(n - 1) + 1;
}

int func1(int n)
{
	if (n == 1)
	{
		return 1;
	}
	else if (n == 2)
	{
		return 2;
	}
	return func1(n - 1) + func1(n - 2);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = func2(n);
	printf("%d\n", ret);

	return 0;
}

2.问题:

将A柱上n个盘子全部移动到C上,过程中可以借用B柱,但要始终保持大盘子在小盘子下面

3.解析:

建立函数func2为求得n个盘子所需要的步数

原问题为求func2(n)

首先,第一轮,将A上边的(n - 1)个移动到B上,要func2(n - 1)次,然后,将剩下的那一个放到C处去,要一次,再讲B上的(n-1)个放到C上去,要(n-1)次.那么就将原问题变化为了求2*func2(n-1)+1.

然后到了第二轮,将B上边的(n-2)个放到A上去,要func2(n-2)次,再将最下边的那一个放到C中去,要一次,现在就将目标投向了求将A上边的(n-2)个放到C中去,要func2(n-2)次,,共要2*func2(n-2)+1次

注意:到最终的2个盘子的时候要3次,到最终的1个盘子的时候要1次

以此类推得代码

上边为递归

下边为迭代

找规律发现1,2,3,4个盘子要(2**n - 1)次

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int func2(int n)
{
	if (n == 1)
	{
		return 1;
	}
	else if (n == 2)
	{
		return 3;
	}
	return 2 * func2(n - 1) + 1;
}

int func1(int n)
{
	if (n == 1)
	{
		return 1;
	}
	else if (n == 2)
	{
		return 2;
	}
	return func1(n - 1) + func1(n - 2);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	int ret = 1;
	//找规律发现1,2,3,4个盘子要(2**n - 1)次
	if (n > 2)
	{
		for (i = 0; i < n; i++)
		{
			ret *= 2;
		}
		printf("%d\n", ret - 1);
	}
	else if (n == 1)
	{
		printf("1");
	}
	else if (n == 2)
	{
		printf("2");
	}








	return 0;
}


http://lihuaxi.xjx100.cn/news/1886836.html

相关文章

低版本echarts的升级到新版5.4.0的echarts浏览器预警和报错信息

新版5.4.0的echarts浏览器预警和报错信息 [ECharts] DEPRECATED: ‘normal’ hierarchy in itemStyle has been removed since 4.0. All style properties are configured in itemStyle directly now. 因为normal层被移除&#xff0c;问题代码如下图所示 itemStyle: {normal:…

IEEE CSS 系统辨识与自适应控制工具及资料 - system identification andadaptative control

系列文章目录 前言 一、工具软件 1.1 PBSID Toolbox (Predictor-Based Subspace Identification Toolbox) 通过基于预测器的子空间识别工具箱&#xff0c;您可以对 LTI/LPV/Hammerstein/Wiener 系统进行批量或递归识别&#xff08;开环和闭环&#xff09;。 1.2 LTI Toolbo…

我的创作纪念日--数据结构(四)——渐进时间复杂度

&#x1f600;前言 今天是我的创造256天有太多太多的感想和感谢了言不表意在文章体现吧 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&am…

简单的小题集(八)

文章目录 一、这题有点麻烦二、Nba 总冠军 2 一、这题有点麻烦 信不信这道题的核心内容连两句话都没有&#xff0c;说实话&#xff0c;就这不到两句话的题就能 把你做熄火了&#xff0c;不信你就试试呗&#xff1a; 皮皮的小南教大家玩数字&#xff0c;这不他拿出 n 个数字&am…

高通平台开发系列讲解(USB篇)MBIM 调试记录

文章目录 一、MBIM网卡显示二、未插入SIM卡情况显示三、SIM 无服务四、正常五、抓取QXDM log 分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文主要介绍MBIM网卡调试过程的记录。 一、MBIM网卡显示 若显示黄标,则检查mbimd进程是否正常,mbim驱动是否正常。 二…

(第40天)RAC 常用管理命令总结

RAC 常用命令 RAC 管理命令可以分为以下几层: 节点层:olsnodes网络层:oifcfg集群层:crsctl,ocrcheck,ocrdump,ocrconfig应用层:srvctl,onsctl这些命令都可以加 -h 来查看帮助信息,下面列举一些在日常管理中比较常用的命令: ## 查看集群状态 [grid@luciferdb03:~]$ crs…

C++ throw(抛出异常)详解

C 异常处理的流程&#xff0c;具体为&#xff1a; 抛出&#xff08;Throw&#xff09;--> 检测&#xff08;Try&#xff09; --> 捕获&#xff08;Catch&#xff09; 异常必须显式地抛出&#xff0c;才能被检测和捕获到&#xff1b;如果没有显式的抛出&#xff0c;即使…

Docker笔记:关于Dockerfile及构建镜像

Dockerfile 的作用 Dockerfile让docker命令变得更简单&#xff0c;是用于构建docker镜像&#xff0c;实现自动化部署 Dockerfile 构建自己的centos镜像 这里有一个应用场景&#xff0c;创建一个自己的centos镜像&#xff0c;这个镜像有我们所需的软件 可以将我们一系列的操作…