首页 > 其他分享 >「Day 1—递归问题」

「Day 1—递归问题」

时间:2024-08-04 22:28:53浏览次数:6  
标签:cout 递归 int 树为 mid id 问题 ans Day

递归问题

定义

简洁来说就是一个函数不断调用自身的一个过程。

习题

汉诺塔问题

思路

对于这个经典的问题,我们考虑了使用递归的做法,由于盘子是在三个底座上来回辗转的,所以我们要确定起始座,辅助座,和目标座。我们专注于最下面的最大的那个盘子,先将盘子都放到辅助座上,等到只剩最大的,将其放到目标座上,再继续由辅助座向目标座转移。

代码
void hanoi(int n,char a,char b,char c){
	if(n > 0){
		hanoi(n - 1,a,c,b);
		cout<<a<<"->"<<n<<"->"<<b;
		hanoi(n - 1,b,a,c);
	}
	return;
}

P5657 [CSP-S2019] 格雷码

思路

首先我们在读题的过程中就可以观察到,对于 \(n\) 位的格雷码,必须由 \(n-1\) 推出来,我们不免想到通过递归来实现,但在仔细观察之后会发现:

以 \(3\) 位格雷码为例,分别是000,001,011,010,110,111,101,100;那么他们是怎么得出来的呢,观察下图:

我们发现格雷码是有规律的,分为前一半和后一半,前为0,后为1,比较像一个二叉树,因为后面一半是逆序,所以左右对称。在左半边,所以如果根为0,那么左子树为0,右子树为1;如果根为1,那么左子树为1,右子树为0。右半边则相反.

代码
#include<iostream>
#include<cmath>
using namespace std;

unsigned long long n,k;
bool flag = 0;

int main(){
	cin >> n >> k;
	unsigned long long mid = pow(2,n-1);
	while(mid){
		if(!flag){
			if(k < mid){
				cout << "0";
				flag = 0;
			}
			else if(k >= mid){
				cout << "1";
				flag = 1;
				k = k - mid;
			}
		}
		else if(flag){
			if(k < mid){
				cout << "1";
				flag = 0;
			}
			else if(k >= mid){
				cout << "0";
				flag = 1;
				k = k - mid;
			}
		}
		mid /= 2;
	}
	return 0;
}

UVA679 Dropping Balls

思路

对于此题,我们依旧按朴素的思路,将 \(I\) 之前全模拟一遍,但是,我们发现,会TLE。故我们进行一些优化,根为n,则左子树为2n,右子树为2n+1,接下来我们需要看第I个小球会走哪里,通过观察发现,当 \(I\) 为偶数时,先走左边,反之。

代码
#include<iostream>
using namespace std;

int T;

int main(){
	
	cin >> T;
	
	while(T--){
		int deep,id,ans = 1;
		cin >> deep >> id;
		for(int i = 1;i < deep;i++){
			if(id % 2 == 1){
				ans = ans * 2;
				id = id / 2 + 1;
			}
			else{
				ans = ans * 2 + 1;
				id = id / 2;
			}
		}
		cout << ans <<"\n";
	}
	
	
	return 0;
}

标签:cout,递归,int,树为,mid,id,问题,ans,Day
From: https://www.cnblogs.com/To-Carpe-Diem/p/18342236

相关文章

  • Java环境变量配置的最佳实践和常见问题解决方案
    Java环境变量配置的最佳实践和常见问题解决方案大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java开发中,环境变量的配置是保证应用程序顺利运行的关键。无论是在本地开发环境还是生产环境,正确配置Java环境变量不仅能提升开发效率,还能避免许多常见......
  • final关键字day08
    /*父类中的除了非私有的,非静态方法,构造方法,难道其他的方法都可以让子类重写吗?如果某一个方法不想子类重写,只能让子类使用java提供了以关键字:final最终的,不可变可以修饰类,成员变量,成员方法*//*final:最终的,不可变的可以修饰类,成员变量,成员方法......
  • 生产(线上)问题排查思路
    目录题外话线上问题应急的原则1.首先第一时间恢复系统2.尽量保留现场和数据3.处理和决断要快速问题排查思路梳理1.首先确定接口2.前后端兵分两路排查2.1前端:2.1.1是否有代码变更,检查变更逻辑是否正确2.1.2字段是否用错2.1.3是否有缓存(应用缓存/cdn缓存)2.1.4是......
  • Linux 系统问题分析常用命令整理
    lsof在许多Linux或者类Unix系统里都有lsof命令,它常用于以列表的形式显示所有打开的文件和进程。打开的文件包括磁盘文件、网络套接字、管道、设备和进程。使用这条命令的主要情形之一就是在无法挂载磁盘和显示正在使用或者打开某个文件的错误信息的时候。常用的参数列表:l......
  • Java学习-Day5
    一、标识符含义:Java标识符是用来命名类、变量、方法以及其他的编程元素的名字。标识符命名规则:标识符可以由字母,美元符号($)和下划线(_)组成。不能以数字开头。区分大小写:例如myVar 和 myvar 是两个不同的标识符。不能是关键字:例如 int , class,public 等。不能包含空格......
  • 继承与成员变量以及构造方法的关系day08
    继承与成员变量的关系:1、怎么寻找?子类方法中使用变量的规则是:(就近原则)1)先在方法内部寻找,若找到就直接使用2)方法内部找不到,去当前类的成员变量的位置上寻找,若找到就直接使用3)若当前类的成员变量的......
  • 继承的特点注意事项以及类的初始化顺序和加载顺序day08
    继承的好处提高了代码的复用性多个类相同的成员可以放到同一个类中提高了代码的维护性如果功能的代码需要修改,修改一处即可让类与类之间产生了关系,是多态的前提其实这也是继承的一个弊端:类的耦合性很强......
  • 继承和成员方法的关系,重载和重写day08
    /*继承和成员方法的关系1、寻找规则:现在本类中寻找,若找到就使用;若本类中没有对应方法,就使用继承自父类中的方法,如果还是没有,就报错。2、java中所有的类都有一个共同的父类:Object3、如果子类中的方法的返回值类型,方法名,参数列表都与父类中一样,这样......
  • 代码随想录Day4
    24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1]提示:链表......
  • 计算机找不到w32n55.dll怎么办,一站搞定w32n55.dll文件缺失问题
    w32n55.dll是一个动态链接库文件。它常与锐捷认证相关,在一些使用路由器登录锐捷校园网的场景中可能会被用到。那么有朋友遇到w32n55.dll文件丢失找不到是怎么回事呢?下面就来一起看看吧。w32n55.dll文件的作用:网络认证支持:协助完成特定的网络认证流程,如锐捷网络认证。......