這種題目一般有兩種方法,比較直接的方法就是使用循壞,但是對於這種方法只有r小於等於4時才是可行的,這個時候複雜度是(o(n^r)),可知,這種方法的時間複雜度很高,而且這種迴圈機制嚴重依賴r,通過r來控制迴圈層數,因此這種方法不具有普遍性。最常用的方法就是使用遞迴。
在迴圈演算法設計中,每個組合中的資料都是從大到小排列是必須的,因為遞迴演算法設計時要找出大規模問題與小規模問題之間的關係。
當 n = 5, r = 3時,從大到小排列的組合數目是:
5 4 3
5 4 2
5 4 1
5 3 2
5 3 1
5 2 1
4 3 2
4 3 1
3 2 1
總得組合數total = 10;
分析以上資料可以知道,首先固定第乙個數5,其後求解n=4,r=2的組合數,共6個組合,其次固定第乙個數4,其後就是求解n=3,r=2的組合數,總共是3個組合數;最後固定第乙個數3,其後就是求解n=2,r=2的組合數,共乙個組合。
遞迴思路就是:n個數中r個數組合遞推到n-1個樹種r-1個數有組合,n-2個數中r-1個數有組合,。。。r-1個數中r-1個數組合;當r=1時,遞迴終止;
package com.base;
public class permutation
for(int i = j-1; i >= 0; i --)
system.out.println();
} else
} }public static void main(string args)
}}
結果如下所示:
6,5,4,
6,5,3,
6,5,2,
6,5,1,
6,4,3,
6,4,2,
6,4,1,
6,3,2,
6,3,1,
6,2,1,
5,4,3,
5,4,2,
5,4,1,
5,3,2,
5,3,1,
5,2,1,
4,3,2,
4,3,1,
4,2,1,
3,2,1,
通過對這個題目的深入了解和**,對遞迴有了較深的認識。
求 從m個自然數中任取n個數的所有組合
問題 編寫乙個遞迴演算法,找出從自然數1,2,3,m中任取n個數的所有組合。例如 m 5,n 3時,所有組合為543,542,541,532,531,521,432,431,421,321。方法1 設這m個自然數存放在整數陣列a k 中,a i 存放i 1 0 i n 1 可採用遞迴演算法,例如,m...
用回溯法找出n個自然數中取r個數的全排列
回溯法也稱為試探法,該方法首先暫時放棄關於問題規模大小的限制,並將問題的候選解按某種順序逐一列舉和檢驗。在回溯法中,放棄當前候選解,尋找下乙個候選解的過程稱為回溯。本例項是用回溯法輸出n個自然數中以r個數全排列。如下 1 public void arrange int n,int r 2int i ...
從n個數中挑m個的排列組合演算法
created on 2020 7 16 從n個數中挑m個的排列組合演算法 var result 最終的結果 var array 1,2,3,4 被挑選的 param array 被選則的陣列 param max 要選出m個進行排列組合 param tmp 快取的陣列 function getone...