當前位置:首頁 » 操作系統 » 排列組合的遞歸演算法

排列組合的遞歸演算法

發布時間: 2022-05-05 08:18:24

c語言中如何用遞歸的方法求從n個數中取m個數的排列組合的所有情況,其中n<m,要求寫出完整的程序

典型的組合問題,解法有遞歸、回溯等等
遞歸法較簡單,代碼如下:

void combine(int a[], int n, int m, int b[], int M);

參數:
a 存放候選數字
n 總項數
m 取出項數
b 存放選出結果
M = m


#include"stdio.h"
#defineMAX100

voidcombine(inta[],intn,intm,intb[],intM);

intmain(void)
{
inti;
inta[MAX],b[MAX];

for(i=1;i<100;i++)
a[i-1]=i;

combine(a,5,4,b,4);
}

voidcombine(inta[],intn,intm,intb[],intM)
{
inti,j;

for(i=n;i>=m;i--)
{
b[m-1]=i-1;
if(m>1)
combine(a,i-1,m-1,b,M);
else
{
for(j=M-1;j>=0;j--)
printf("%d",a[b[j]]);
printf(" ");
}
}
}



其他方法可查閱相關資料。

② 排列組合中c53是怎麼算的,5在下,3在上

C(5,3)=C(5,2)=5*4/2*1=20/2=10

1、從n個不同元素中,任取m(m≤n)個元素並成一組,叫做從n個不同元素中取出m個元素的一個組合;從n個不同元素中取出m(m≤n)個元素的所有組合的個數,叫做從n個不同元素中取出m個元素的組合數。

2、在線性寫法中被寫作C(n,m)。組合數的計算公式為

即從m個不同元素中取出n個元素的組合數=從m個不同元素中取出 (m-n) 個元素的組合數;

這個性質很容易理解,例如C(9,2)=C(9,7),即從9個元素里選擇2個元素的方法與從9個元素里選擇7個元素的方法是相等的。

規定:C(n,0)=1 C(n,n)=1 C(0,0)=1

參考資料


網路-組合數

③ 排列組合中A和C怎麼算啊

1、排列組合中,組合的計算公式為:

④ c語言 排列組合 程序演算法

#include<stdio.h>
#include<string.h>
void
Show(int
n,int
len
,char
str[],
char
p[],int
*i)
{
/*函數功能說明: 密碼窮舉法
遞歸演算法
參數說明:
len
密碼可選元素的個數,實際等於
strlen(str);
n
密碼位數。
STR[]密碼表。
*p
密碼排列組合的臨時存檔
*/
int
a;
n--;
for(a=0;
a
<
len;
a++)
{
p[n]=str[a];
if(n==0)printf("%d:%s
",(*i)++,p);
if(n>0)Show(n,len
,
str,p,i);
}
} /*驅動程序
用於測試*/
int
main(void)
{
char
str[]="abcdef";//密碼表
可選元素集合可根據選擇修改
int
n=4; //密碼位數,根據具體應用而定。
int
len=strlen(str);//用於密碼元素集合計數。
char
p[20]; //存放排列組合的密碼,用於輸出。
int
num=0;//存放統計個數的整數值,
int
*i=#//計數器
地址。
p[n]='\0';//這個不用說啦。 Show(
n,len
,str,
p
,i);
printf("\n%d
位密碼,每個密碼有%d個選擇的話,共有:%d個組合。\n",n,len,*i); return
0;
}

⑤ 排列組合演算法,要求從一堆數中任取m個數組合使得m個數的和最接近某個數

典型的組合問題,解法有遞歸、回溯等等遞歸法較簡單,代碼如下: void combine(int a[], int n, int m, int b[], int M); 參數:a 存放候選數字n 總項數m 取出項數b 存放選出結果M = m

#include "stdio.h"#define MAX 100 void combine(int a[], int n, int m, int b[], int M); int main(void){ int i; int a[MAX], b[MAX]; for (i = 1; i < 100; i++) a[i - 1] = i; combine(a, 5, 4, b, 4);} void combine(int a[], int n, int m, int b[], int M){ int i, j; for (i = n; i >= m; i--) { b[m - 1] = i - 1; if (m > 1) combine(a, i - 1, m - 1, b, M); else { for (j = M - 1; j >= 0; j--) printf("%d ", a[b[j]]); printf("\n"); } }}

其他方法可查閱相關資料。

⑥ 全排列演算法(摻雜了遞歸)理解不了,幫忙看看

解釋:

int p[]; // 用來存放參與排列組合的數據的數組(有效元素下標從 1 到 n)

int n; // 參與排列組合的數據的個數


void perm(int m){……}

// 用來進行局部排列組合的函數

// 其中的 m 表示本輪局部排列組合的起點,即,將數組中 m 到 n 的元素進行排列組合

// 但是如果 m==n 則表示已經完成了一個排列組合,所以輸出一個排列組合結果。


程序注釋:

voidperm(intm){
intj,temp;//j循環中要處理的元素下標,temp交換數據時要用到的臨時變數

if(m==n)//如果需要進行局部排列組合的數據就只是最後一個數據
{
//那麼不需要再進行局部排列組合了,
//直接輸出數組中的所有數據,得到了一個排列結果。
for(j=1;j<=n;j++)
printf("%d",p[j]);//輸出每一個數據
printf(" ");//追加一個換行符
return;//本輪局部排列組合結束
}


//保持m號元素之前的數據不變,
//將m到n的元素進行局部排列組合。
for(j=m;j<=n;j++)
{
temp=p[m];p[m]=p[j];p[j]=temp;//將m到n的元素逐個交換到m位置上
perm(m+1);//再對m之後的部分進行局部排列組合。
temp=p[m];p[m]=p[j];p[j]=temp;//把以前在m位置上的數據交換回來
}
}

比如要對 1,2,3,4,5 進行全排列組合


先從 1,2,3,4,5 中,每次選出一個作為第一個數

然後再從其餘的數字中,每次選出一個作為第二個數

然後再從其餘的數字中,每次選出一個作為第三個數

然後再從其餘的數字中,每次選出一個作為第四個數

再將最後剩下的數據作為第五個數

⑦ 排列組合演算法

可用遞歸演算法 實現N重循環 來實現
詳細請QQ :115499275
以下也許有助於你
以下為文件<Form1.frm>的內容:
VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 8115
ClientLeft = 60
ClientTop = 345
ClientWidth = 5760
LinkTopic = "Form1"
ScaleHeight = 8115
ScaleWidth = 5760
StartUpPosition = 3 '窗口預設
Begin VB.ComboBox Combo1
Height = 300
Left = 4200
TabIndex = 2
Text = "Combo1"
Top = 960
Width = 1215
End
Begin VB.TextBox Text1
Height = 7455
Left = 120
MultiLine = -1 'True
ScrollBars = 2 'Vertical
TabIndex = 1
Text = "Form1.frx":0000
Top = 120
Width = 3855
End
Begin VB.CommandButton Command1
Caption = "Command1"
Height = 495
Left = 4200
TabIndex = 0
Top = 120
Width = 1215
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim Pwd As String

Function NFormM(ByVal iStart As Integer, iEnd As Integer, Num As Integer, Optional Str As String)
Dim i As Integer
If Num = 0 Then
With Text1
.Text = Text1.Text & Str & vbNewLine
.SelStart = Len(.Text)
End With
Else
For i = iStart To iEnd
DoEvents
NFormM i + 1, iEnd, Num - 1, Str & Mid(Pwd, i, 1)
Next
End If
End Function

Private Sub Command1_Click()
Dim out(), i As Integer, s As String
Text1.Text = ""
NFormM 1, Len(Pwd), Val(Combo1.Text)
End Sub

Private Sub Form_Load()
Dim i As Integer
With Combo1
For i = 1 To 12
.AddItem i
Pwd = Pwd & Chr(64 + i)
Next
Print Pwd
End With
End Sub

⑧ 設計遞歸演算法生成n個元素的所有排列對象

#include<iostream>
#include<iterator>
#include<algorithm>
using namespace std;

template<class T>
void permutation(T list[], int k, int m)
{
if (k == m)
{
(list, list + m + 1, ostream_iterator<T>(cout, "")); //將當前list排序
cout << endl;
}
else{
for (int i = k; i <= m; i++)
{
swap(list[i], list[k]); //將下標為i的元素交換到k位置,類似從list[k:m]中剔除操作
permutation(list, k + 1, m);
swap(list[i], list[k]);
}
}
}

int main(int argc, char* argv[])
{
char arr[3] = { 'a', 'b', 'c' };
cout << "排序結果如下:" << endl;
permutation(arr, 0, 2);
return 0;

}

(8)排列組合的遞歸演算法擴展閱讀

遞歸,在數學與計算機科學中,是指在函數的定義中使用函數自身的方法。也就是說,遞歸演算法是一種直接或者間接調用自身函數或者方法的演算法。

通俗來說,遞歸演算法的實質是把問題分解成規模縮小的同類問題的子問題,然後遞歸調用方法來表示問題的解。

遞歸的基本原理

第一:每一級的函數調用都有自己的變數。

第二:每一次函數調用都會有一次返回。

第三:遞歸函數中,位於遞歸調用前的語句和各級被調用函數具有相同的執行順序。

第四:遞歸函數中,位於遞歸調用後的語句的執行順序和各個被調用函數的順序相反。

第五:雖然每一級遞歸都有自己的變數,但是函數代碼並不會得到復制。

⑨ 關於排列組合的一些演算法編程問題

#include <stdio.h>

void delect(int n,int *p)

{

int i,j=0,k,a[n],b[n];

int temp[10]={1,2,3,4,5,6,7,8,9,10};

for(i=0;i<n;i++)

a[i]=*(p+i);


for(i=0;i<n;i++)

for(j=0;j<10;j++)

if(a[i]==temp[j])

temp[j]=-1;

for(i=0,j=0;i<10;i++)

if(temp[i]>0)

b[j++]=temp[i];


for(i=0;i<n;i++)

for(j=i+1;j<n;j++)

for(k=j+1;k<n;k++)

printf("(%d,%d,%d) ",b[i],b[j],b[k]);

}


main()

{

int a[10],i,j,k,N;

int *p=a;

printf("how much nums:");

scanf("%d",&N);

printf("input nums:");

for(i=0;i<N;i++)

scanf("%d",&a[i]);

for(i=0;i<N;i++)

for(j=i+1;j<N;j++)

for(k=j+1;k<N;k++)

printf("(%d,%d,%d) ",a[i],a[j],a[k]);

//for(i=0;i<N;i++) printf("%d",*(p+i));

printf(" delect ");

delect(10-N,p);

}

⑩ 在C語言中怎麼設計排列組合的演算法呢(請勿百度演算法給我謝謝,我想知道怎麼想得到這個演算法)謝謝!

採用遞歸思路:假設有A1,A2,A3...An種元素
排列:
(1)把所有元素作為一個集合,可以拆分為一個元素+剩餘元素的子集合,有n種拆法(A1/剩餘元素,A2/剩餘元素...An/剩餘元素)
(2)把第一步中的子集合,按照(1)的思路進一步拆分,直到滿足(3)
(3)當子集合中只有1種元素時,此時為Ax/Ay,排列就只有兩種:Ax+Ay和Ay+Ax

組合:計算出排列後,組合就是:判斷新生成的排列方案與之前的排列方案是否為同一種組合,比如Ax+Ay與Ay+Ax是不同的排列、是相同的組合

熱點內容
如何刪除手機中的游戲緩存 發布:2024-10-07 02:11:28 瀏覽:873
解鎖資料庫用戶 發布:2024-10-07 01:55:54 瀏覽:826
關系資料庫的關鍵字是指 發布:2024-10-07 01:55:54 瀏覽:517
java資料庫date 發布:2024-10-07 01:55:21 瀏覽:458
安卓12如何開通運用許可權 發布:2024-10-07 01:29:54 瀏覽:134
電腦顯示已連接圖形伺服器 發布:2024-10-07 01:24:38 瀏覽:797
如何恢復手機伺服器的時速 發布:2024-10-07 01:22:30 瀏覽:749
c語言六套 發布:2024-10-07 01:22:26 瀏覽:383
安卓手機系統文件存在哪裡 發布:2024-10-07 01:21:30 瀏覽:898
編譯原理文字題 發布:2024-10-07 00:53:58 瀏覽:332