求一个数的整数分化问题(python)实现

整数的分化问题:
对于一个正整数n的分划,就是把n表示成一系列正整数之和的表达式。分划与顺序无关,例如6=5+1和6=1+5被认为是同一种分划。另外,这个正整数自身也算是一种分化。
例:对正整数n=6的分划:
6
5+1
4+2 4+1+1
3+3 3+2+1 3+1+1+1
2+2+2 2+2+1+1 2+1+1+1+1
1+1+1+1+1+1

求:对于正整数n,计算其分划的数目P(n)

模型建立:
找出建立递归分划数目的公式
根据n=6的实例可以发现:第一行及后面的数据都不超过6,第二行及以后的数据都不超过5,……,第六行的数据不超过1。因此定义函数Q(n,m),表示整数n的“任何加数都不超过m”的分划的数目,n的所有分划数目P(n)就应该表示Q(n,n)。
Q(n,m)有以下递归关系:
1、 Q(n.n) = 1 + Q(n,n-1) '1’表示n之包含一个被加数等于n本身的分划,其余的分划表示n的所有其他分划,即最大加数m<=n-1的分划
2、Q(n,m) = Q(n,m-1) + Q(n-m,m) (m<n)
等式右边的第一部分表示被加数中不包含m的分数的数目,第二部分表示被加数中包含(不是小 于)m的分划的数目,因为如果确定了一个分划的被加数中包含m,则剩下的部分就是对n-m进行 不超过m的分划。
递归的停止条件:
(1)、Q(n,1) = 1,表示当最大的被加数是1时,该整数n只有一种分划,即n个1相加;
(2)、Q(1,m) = 1,表示整数n = 1只有一个分划,不管最大被加数的上限m是多大
算法设计:
因为当n<m时,Q(n,m)是没有意义的,因为n的分划不可能包含大于n的被加数m,此时令Q(n,m)=Q(n,n),同理,当n<1,或m<1时,Q(n,m)也是没有意义的。

def divinteger(n,m):
    if n == 1 or m == 1:
        return 1
    elif n < m:
        return divinteger(n,n)
    elif n == m:
        return 1 + divinteger(n,n-1)
    else:
        return divinteger(n,m-1) + divinteger(n-m,m)

def main():
    n = int(input("请输入n的值:"))
    if n < 1:
        print("输入的参数有误!")
    num = divinteger(n,n)
    print("%d 的分划数为:%d" %(n,num))

if __name__ == '__main__':
    main()

运行结果:

请输入n的值:6
6 的分划数为:11
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页