c語言遞歸排列
① 在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是不同的排列、是相同的組合
② 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(" ");
}
}
}
其他方法可查閱相關資料。
③ C語言如何實現有重復元素的全排列
在遞歸裡面用交換的方式獲取全排列,從第一個開始,不斷與後面數交換,當然遞歸時不要忘記在後面寫個換回來的語句。只要加個交換條件就可以了,在不相等時交換,相等時不交換。
當前階段,在編程領域中,C語言的運用非常之多,它兼顧了高級語言和匯編語言的優點,相較於其它編程語言具有較大優勢。計算機系統設計以及應用程序編寫是C語言應用的兩大領域。同時,C語言的普適較強,在許多計算機操作系統中都能夠得到適用,且效率顯著。
C語言擁有經過了漫長發展歷史的完整的理論體系,在編程語言中具有舉足輕重的地位。
特有特點
C語言是普適性最強的一種計算機程序編輯語言,它不僅可以發揮出高級編程語言的功用,還具有匯編語言的優點,因此相對於其它編程語言,它具有自己獨特的特點。具體體現為以下三個方面:
其一,廣泛性。C語言的運算范圍的大小直接決定了其優劣性。C語言中包含了34種運算符,因此運算范圍要超出許多其它語言,此外其運算結果的表達形式也十分豐富。此外,C語言包含了字元型、指針型等多種數據結構形式,因此,更為龐大的數據結構運算它也可以應付。
其二,簡潔性。9類控制語句和32個關鍵字是C語言所具有的基礎特性,使得其在計算機應用程序編寫中具有廣泛的適用性,不僅可以適用廣大編程人員的操作,提高其工作效率,同時還能夠支持高級編程,避免了語言切換的繁瑣。
其三,結構完善。C語言是一種結構化語言,它可以通過組建模塊單位的形式實現模塊化的應用程序,在系統描述方面具有顯著優勢,同時這一特性也使得它能夠適應多種不同的編程要求,且執行效率高。