IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> P2404 数的拆分中看递归算法 -> 正文阅读

[Java知识库]P2404 数的拆分中看递归算法

Hello!我是C风,专注与算法以及Java的学习,今天我们就来看一下数的拆分这个题目,并由此来总结一下递归算法。
话不多说,我们先来看一下这道题目:
题目描述:

任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。现在给你一个自然数n,要求你求出n的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。

输入格式:

输入:待拆分的自然数n。

输出格式:

输出:若干数的加法式子。

输入:

7

输出:

1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4

这个题目就是将一个数不断拆分的过程,这里我们观察发现输出的首项是小于输入数字的一半的,我们首先就要想一下这个过程是如何的。
这其实就是一个DFS题目,首先就是将7拆分成1,2,3;之后再将拆分之后的数继续拆分直到最后只剩0;所以只要这样一想,我们就直到这是一道的典型的DFS题,按照我上一篇博客讲的,这里的递归结束条件就是不能继续拆分,另外一个需要注意的点拆分层的下一层的数要比该层大或者相等,也就是说第一步拆分2后就不能再拆1了
所以这样一想我们的关键函数就可以写出来了,不一定要if语句来表示递归结束的条件,这里我们输入数据后在循环条件里面就会自己进入下一个分支,当num == 1时循环就会结束,也就是没有其他的分支时那就会结束,所以我们就不要过于死板,这里就在for循环的下面加上递归结束的配套代码即可。这里主要时一开始没有思考,不知道start的作用。这个start的作用就是让子支大于等于主支,并且在循环过程中会自动更新num的值。

int DFS(int num,int loadnum, int start)
{//loadnum记录我们输入的数,因为再递归时num会变化
		for (int i = start; i <= num / 2; i++)//这里就是找不到分支的时候结束循环
		{//所以就不需要另加结束条件,但是要删除一个num = 4
			Load[t] = i;
			t++;
			DFS(num - i,loadnum, i);
			t--;
		}
		if (num == loadnum)
		{
			return 0;//这样也结束
		}
		cnt++;
		Load[t] = num;
		print(Load);
		return 0;// 递归结束条件就是不满足上述关系
}

接下来就是我们的打印函数了,这里就只需要注意一下打印的格式就好了

void print(int* Load)
{
	for (int i = 0; i < t; i++)
	{
		printf("%d+", Load[i]);
	}
	printf("%d\n", Load[t]);
}

之后的主函数当然就不需要解释了,但是为了代码的完整性,我还是也上传一下

int cnt = 0;
int Load[10];
int t = 0;
············
int main()
{
	int num;
	int loadnum;
	cin >> num;
	loadnum = num;
	DFS(num,loadnum, 1);
	//printf("%d", cnt);//这个可以记录一共有多少种拆法
}

这里我定义了几个全局变量,其实是可以变成非全局变量的,这里以减少全局变量t为例,我们可以在主函数里定义一个t,然后在DFS函数与print函数里都加一个变量,这样其范围就减少很多了,但是我们需要注意这是值传递,t的值本身没有变化。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-09 11:36:30  更:2021-09-09 11:38:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:27:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码