step by step.
目录
一、 递归:直接或间接地调用自身的算法
递归时间复杂度计算
例题:
二、 例2-4 排列问题
设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列
• 设 R={r 1 ,r 2 , … , r n } 是要进行排列的 n 个元素, R i =R-{ r i }。• 集合 X 中元素的全排列记为 perm(X)。• ( r i )perm(X) 表示在全排列 perm(X)的每一个排列前加上前缀得到的排列。
2-4 排列问题算法思路
👇
T(n) = O(n!)
2-4 排列问题算法代码
void Perm( Type list[], int k, int m)
{
if(k==m){
for(int i=0; i<=m; i++)
cout<<list[i];
cout<<endl;
}
else{
for(int i=k; i<=m; i++){
swap(list[i],list[k]); //定开头
Perm(list,k+1,m); //排后序
swap(list[i],list[k]); //恢复原序列
}
}
三、 2-5 整数划分问题
将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,
其中: n1≥n2≥…≥nk≥1,1≤k≤n。
正整数n的这种表示称为正整数n的划分。
求正整数n的不同划分个数。
例如正整数6有如下11种不同的划分:
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。
2-5 整数划分算法思想
(1)q(n,m)=1,(m=1,n=1);
n=1说明1的加数其实不就自己吗,m=1说明最大加数是1,那不也是只有一种吗,狂加1。
就是比如👉q(6,1)👉6=1+1+1+1+1+1;👉一种方式👉q(6,1)=1
(2) q(n,m)=q(n,n),(n<m);
最大加数其实只能<自身,不然无效,换为q(n,n)
就是比如👉q(6,7)👉不然你还得6=7-1?×👉q(n,m)=q(n,n)
(3) q(n,m)=1+q(n,n-1) (m=n);
正整数n的划分由n1=n的划分和n1≤n-1的划分组成。+1是因为:最大加数是自身,仅一种。
就是比如👉q(6,6)👉6=6;……👉一种(等于自身)+其他加数👉q(6,6)=1+q(6,5)
(4) q(n,m)=q(n,m-1)+q(n-m,m),(n>m>1);
正整数n的最大加数n1不大于m的划分由n1=m的划分和n1≤m-1 的划分组成
就是比如👉q(6,4)👉6=4+……👉最大加数小于4的划分种数+(6-4)的划分种数👉q(6,4)=q(6,3)+q(2,4)