一种递归式的非零自然数全分解方法
在开始讲之前,首先介绍一下这个方法针对的问题背景:一个非零自然数(1,2,3,……)既不重复也不遗漏地任意分解为非零自然数(如:3=1+1+1=1+2),我在本篇暂且称为非零自然数的全分解。在非零自然数的全分解中,总共有多少种分解方法,并列出所有分解方法,我在本篇暂且称为非零自然数的全分解问题。
这个问题主要来源于我弟学校的一道编程题,在解题的过程中一个很重要的环节就是解决非零自然数的全分解问题。
其实,在网上有很多朋友使用动态规划的方法解决了这个问题,但是对于没有运筹学或者数学建模基础的大一学生来说,要想到动态规划那就太为难了。
除此之外,网上也有朋友使用递归的方法解决这个问题,本质上和我的方法相去不远,但细节上有一些差异。重要的是绝大多数都是直接给出了求解代码,并没有相应的解释。本文将从逻辑上证明我的方法的分解完备性。
冥思了一段时间以后,我探索出了这个递归式的非零自然数全分解方法,使用这个方法,可以保证分解过程通俗易懂、不重不漏,更重要的是适合计算机计算!
一、基本概念
1. 分解末项
一个分解中的最后一项称为分解末项。如“3=1+2”中分解末项为“2”,再如“3=1+1+1”中分解末项为“1”。
2. 分解基数B
分解基数,在数值上定义为分解末项的前一项,举个例子:“5=1+4”称为分解基数B=1的一个分解,“5=1+2+2”称为分解基数B=2的一个分解。
我们也可以把“5=1+4”到“5=1+2+2”的过程理解为一个将分解末项“4”按分解基数B=2的分解。实际上这种理解更为重要,因为在本方法中,我们本质上也是针对分解末项的分解。
二、分解规则
1. 关于分解基数
分解基数单调不减。如:“7=2+5=2+1+4”为一个错误的分解过程,因为第一级分解基数为2,第二级分解基数为1,违反分解基数单调不减原则。所以,“7=2+5=2+2+3”才是一个正确的分解过程。
2. 关于分解末项
分解末项应不小于分解基数。如:“5=1+1+3”为一个正确的分解,“5=1+3+1”为一个错误的分解。
三、举例
根据前述的两条分解规则,对7的全分解过程如下图所示,可以看到总共有14种分解方法。实际上,7的全分解就是这14种分解方法。
四、分解的性质
1. 分解末项与分解基数的关系
记第n级的分解末项为
E
n
E_n
En,第n级的分解基数为
B
n
B_n
Bn,那么n级分解末项等于n-1级分解末项减去n级分解基数,即:
E
n
=
E
n
−
1
−
B
n
E_n=E_{n-1}-B_n
En=En−1−Bn。
比如:7=1+6=1+2+4中
E
0
=
7
,
E
1
=
6
,
B
1
=
1
,
E
2
=
4
,
B
2
=
2
E_0=7,E_1=6,B_1=1,E_2=4,B_2=2
E0=7,E1=6,B1=1,E2=4,B2=2,显然有
E
1
=
E
0
−
B
1
=
7
−
1
=
6
,
E
2
=
E
1
−
B
2
=
6
−
2
=
4
E_1=E_0-B_1=7-1=6, E_2=E_1-B_2=6-2=4
E1=E0−B1=7−1=6,E2=E1−B2=6−2=4。
2. 分解基数具有可交换性
本方法实质上是在合理有序地穷举分解基数,分解基数交换顺序不影响分解结果,比如:对7按B=1, B=2, B=2的顺序分解得到的结果和对7按B=2, B=2, B=1的顺序分解结果是相同的,即7=1+6=1+2+4=1+2+2+2和7=2+5=2+2+3=2+2+1+2是完全相同的两个分解,因为分解基数的组合如果按升序排列都是{1,2,2}。
所以,我们可以得到一个结论,一个非零自然数的两组不同分解,它们的分解基数组合一定不同。但值得注意的是,分解基数组合不同仅仅是必要不充分条件,因为分解基数组合不同,也可能分解结果相同,比如:7=1+6=1+2+4=1+2+2+2对应的分解基数组合为{1,2,2},7=2+5=2+2+3=2+2+2+1对应的分解基数组合为{2,2,2},它们的分解基数组合不同,但它们的分解结果相同,所以分解基数组合的不同并不是充分条件。
所以分解基数单调不减原则保证了正确分解的必要性,因为有了分解基数单调不减原则我们就可以保证所进行的分解基数组合没有重复。根据分解基数单调不减原则,所有的分解基数组合一定是从左到右升序排列的,显然这样得到的分解基数组合都是互不相同的。
3. 全分解实质上是对分解末项的递归分解
前述举了对7全分解的例子,从图中不难看出,实际上每一个分解都是对分解末项进行分解,随着分解深度的增加,分解末项从可分一直到不可分的状态,从而实现递归式的全分解。
上一小节中我提到分解基数单调不减原则是正确分解的必要而不充分条件,7=1+6=1+2+4=1+2+2+2对应的分解基数组合为{1,2,2},7=2+5=2+2+3=2+2+2+1对应的分解基数组合为{2,2,2},它们的分解基数组合不同,但它们的分解结果相同。
在这一节中,我们将讨论分解末项的可分性。如何判断两个分解结果是否相同,因为加法有交换律,我们按各项从左到右升序重新排列一下,如果重排后得到的式子相同那么两个分解结果相同。
如果我们限制分解末项不小于分解基数,那么分解各项一定是从左到右升序排列的。所以,分解基数单调不减且分解末项不小于分解基数这两个条件加起来就构成正确分解的充要条件。
五、代码
Python代码下载
如果有其他语言代码的需求(C、Matlab等)欢迎和我联系。
联系我
如有疑问,邮件是最快联系我的方式:wm_chen@yeah.net