排列組合 從n個自然數中取出r個數的組合

2021-06-20 22:41:59 字數 1166 閱讀 3068

這種題目一般有兩種方法,比較直接的方法就是使用循壞,但是對於這種方法只有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...