算法笔记 递归:产生集合的全排列 整数划分

一. 产生集合的全排列

# 集合全排列
def Perm(list, head, tail):
    # 递归出口,构成一次全排列,输出
    if head == tail:
        for i in range(tail+1):
            print(list[i], end=" ")
        print()

    # 产生head到tail的全排列
    else:
        for j in range(head, tail+1):
            list[head], list[j] = list[j], list[head]
            # 进行后面的全排列
            Perm(list, head+1, tail)
            # 全排列以后要恢复之前的顺序,方便下次进行排列的交换位置
            list[head], list[j] = list[j], list[head]

if __name__ == '__main__':
    list = [1,2,3,4,5,6]
    Perm(list, 0, 2) # 产生1到3的排列

在这里插入图片描述

二.整数划分

在这里插入图片描述
在这里插入图片描述

using namespace std;

// 集合全排列
int split(int n,int m){
	if(n==1||m==1) return 1;
	else if(n<m) return split(n,n);
	else if(n==m) return split(n,n-1) + 1;
	else return split(n,m-1) + split(n-m,m);
} 

int main() 
{
	cout << split(6,4);
}           
def split(num, max_sum):
    if num == 1 and max_sum == 1:
        return 1                        # 都是1的时候只有一种
    elif num < max_sum:
        return split(num, num)          # 最大加数不能超过自己
    elif num == max_sum:
        return split(num, num - 1) + 1  # 都相等的话,就是1加上退回一位的划分
    else:
        return split(num, max_sum - 1) + split(num - max_sum, max_sum)  # 最大加数是max_sum,说明这个划分式的头已经确定是max_sum,我们只要划分后面的式子就行了

if __name__ == '__main__':
    print(split(2, 2))

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值