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

一. 产生集合的全排列

# 集合全排列
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的排列

算法笔记 递归:产生集合的全排列 整数划分_第1张图片

二.整数划分

算法笔记 递归:产生集合的全排列 整数划分_第2张图片
算法笔记 递归:产生集合的全排列 整数划分_第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))

算法笔记 递归:产生集合的全排列 整数划分_第4张图片

你可能感兴趣的:(入门学习,算法,python)