利用遞迴,來求任意n個數中取出m個數的全排列

2021-10-01 11:57:32 字數 603 閱讀 3429

分析:

求n個數的全排列,也就是:

第乙個數不動,將後面的n-1個數全排

將第二個數和第乙個數交換,將後面n-1個數全排列(注意要換回來)

將第三個數和第乙個數交換,然後將後面n-1個數全排

…將第n個數和第乙個數交換,然後將後面n-1個數全排

可以利用遞迴的思想來實現,直到n-1等於1

而取出m個數也就是讓n-m=1時結束就可以

下面直接貼**:

#include

//萬能標頭檔案

using

namespace std;

bool

is_swap

(int start ,

int last ,

int*p )

//判重,如果之間start~i間有重複的數字,則不進行交換,避免重複的情況出現

void

perm

(int start ,

int last ,

int*p ,

int len)

//進行全排列

else}}

intmain()

遞迴實現 從n個數中選取m個數的所有組合

有n n 0 個數,從中選取m n m 0 個數,找出所有的組合情況 不分順序 這樣的組合共有 cm n n n 1 n m 1 m 乙個陣列 data 有 n 個元素,從中選取 m 個數的組合 arr,使用遞迴演算法實現是這樣乙個過程 1 選擇 data的第1個元素為arr的第乙個元素,即 arr...

求n 中因子k的個數

思路 求n的階乘某個因子k的個數,如果n比較小,可以直接算出來,但是如果n很大,此時n 超出了資料的表示範圍,這種直接求的方法肯定行不通。其實n 可以表示成統一的方式。n km m a 其中k是該因子,m n k,a是不含因子k的數的乘積 下面推導這個公式 n n n 1 n 2 3 2 1 k 2...

從陣列中取出m個數相加的結果 組合

給定乙個陣列,輸入m,求出m個數相加的和。如num 6 include include using namespace std int flag 100 void dfs int num,int m,int sum,int now,set int ans for int i 0 i 5 i 從num...