『壹』 遞歸全排列 c語言 看不懂
Perm(list,k,m)遞歸的產生所有後綴是list(0:k-1),且後綴是
list(k:m)的全排列的所有排列。
『貳』 C語言中全排列問題思路
方法1:如果位數不多窮舉
方法2:位數多建議遞歸。
『叄』 C語言全排列問題
這其實是一個遞歸
遞歸函數 意思是這樣的
比如有n個數
1 2.。。。n
把1 從第一個開始 往後 與每個數開始交換
然後 第一個數就算定了 後面的 第2個到第n個當成一個整體
再進行這個函數遞歸
也就是說 第二個到第n個進行全排列
這樣下去 當全排列到最後一組數 即第n個數一個的時候
遞歸退出條件就出來了 就可以輸出全排列的值了
當然 最後別忘記把交換的數還原
再進行下一次交換 遞歸哦
所以最後一局的交換也是很重要的
聽完我的解釋 再好好琢磨一下
相信你一定會明白的 要是還是不懂可以繼續追問我
『肆』 C語言 全排列······暈
首先,我下面的敘述是建立在樓主明白什麼是遞歸調用的基礎上的。對遞歸毫無了解的話,請先看看網路。
然後,進入正題。
第一個return:就是返回這個函數的調用者,這個函數執行完畢。這是一個if判斷,當帶排列的數列長度為1時,只有一種可能,輸出,則排列結束,返回。長度不只1的時候,執行以下for。
未完待續
接著講這個
for(i=0;i<n;i++){----------這個循環到底怎麼個看法和順序?
anagram(d,n-1); 怎麼輸出的??(這塊都不明白)
temp=d[0];
for(j=1;j<=n-1;j++){
d[j-1]=d[j];
}
d[n-1]=temp;
}
先講這個演算法的思想,比如對abc進行全排列,那麼可以看做:ab的全排列+c和ac的全排列+b和bc的全排列+a三個的組合。然後再細化,ab的全排列可以看出a的全排列+b,和b的全排列+a兩個的組合。當只有一個時,就是調用if=1的那個情況,直接print。不是1的時候,就是遞歸調用,進行不斷地分解。
這是演算法思想,未完待續
兩個for循環,裡面的for執行一邊後就是把數組的元素挨個往前挪一位,第一位到最後位,然後對前n-1位進行全排列,遞歸進行。從上面的演算法思想中我們可以看出這樣的目的和意義,就是一個類似對上面abc的分解過程,一次a到最後排bc,一次b到最後排ac,一次c到最後排ab。
就先說這么多吧。純手打,望採納!有問題可以補充,或者網路hi我。
我幫你改了一下代碼,加了幾行printf,希望可以解決你的那幾個問題:
#include<stdio.h>
#define NUM 3
void anagram(int[],int);
void print(int[]);
void main()
{
int d[NUM];
int i;
for(i=0;i<NUM;i++)
d[i]=i + 1;
printf("初始化後的數組順序是:");
print(d);
anagram(d,NUM);
}
void anagram(int d[],int n)
{
int i,j,temp;
int p;
if(n==1){
print(d); //列印函數
return;//-------------return返回哪?
} // 和下面的for怎麼聯系起來?
for(i=0;i<n;i++){//----------這個循環到底怎麼個看法和順序?
printf("\ni = %d,n = %d, 准備調用aragram(d,%d)\n",i,n,n-1);
printf("這時候的數組順序是:");
print(d);
anagram(d,n-1); // 怎麼輸出的??(這塊都不明白)
temp=d[0];
for(j=1;j<=n-1;j++){
d[j-1]=d[j];
}
d[n-1]=temp;
}
}
void print(int d[]){
int i;
for(i=0;i<NUM;i++){
printf("%d",d[i]);
}
printf("\n");
}
PS:
改動:1、print函數原來是逆序輸出,改成正序輸出,有利於理解;2、數組原來初始化為321,改為123,有利於理解。就改了這兩個地方,加了一些printf。
你可以運行一下。
輸出結果:
初始化後的數組順序是:123
i = 0,n = 3, 准備調用aragram(d,2)
這時候的數組順序是:123
i = 0,n = 2, 准備調用aragram(d,1)
這時候的數組順序是:123
123
i = 1,n = 2, 准備調用aragram(d,1)
這時候的數組順序是:213
213
i = 1,n = 3, 准備調用aragram(d,2)
這時候的數組順序是:231
i = 0,n = 2, 准備調用aragram(d,1)
這時候的數組順序是:231
231
i = 1,n = 2, 准備調用aragram(d,1)
這時候的數組順序是:321
321
i = 2,n = 3, 准備調用aragram(d,2)
這時候的數組順序是:312
i = 0,n = 2, 准備調用aragram(d,1)
這時候的數組順序是:312
312
i = 1,n = 2, 准備調用aragram(d,1)
這時候的數組順序是:132
132
請按任意鍵繼續. . .
『伍』 C語言如何實現有重復元素的全排列
在遞歸裡面用交換的方式獲取全排列,從第一個開始,不斷與後面數交換,當然遞歸時不要忘記在後面寫個換回來的語句。只要加個交換條件就可以了,在不相等時交換,相等時不交換。
當前階段,在編程領域中,C語言的運用非常之多,它兼顧了高級語言和匯編語言的優點,相較於其它編程語言具有較大優勢。計算機系統設計以及應用程序編寫是C語言應用的兩大領域。同時,C語言的普適較強,在許多計算機操作系統中都能夠得到適用,且效率顯著。
C語言擁有經過了漫長發展歷史的完整的理論體系,在編程語言中具有舉足輕重的地位。
特有特點
C語言是普適性最強的一種計算機程序編輯語言,它不僅可以發揮出高級編程語言的功用,還具有匯編語言的優點,因此相對於其它編程語言,它具有自己獨特的特點。具體體現為以下三個方面:
其一,廣泛性。C語言的運算范圍的大小直接決定了其優劣性。C語言中包含了34種運算符,因此運算范圍要超出許多其它語言,此外其運算結果的表達形式也十分豐富。此外,C語言包含了字元型、指針型等多種數據結構形式,因此,更為龐大的數據結構運算它也可以應付。
其二,簡潔性。9類控制語句和32個關鍵字是C語言所具有的基礎特性,使得其在計算機應用程序編寫中具有廣泛的適用性,不僅可以適用廣大編程人員的操作,提高其工作效率,同時還能夠支持高級編程,避免了語言切換的繁瑣。
其三,結構完善。C語言是一種結構化語言,它可以通過組建模塊單位的形式實現模塊化的應用程序,在系統描述方面具有顯著優勢,同時這一特性也使得它能夠適應多種不同的編程要求,且執行效率高。
『陸』 C語言全排列問題
沒看完,看了第一行,就錯了。
swap(參數應該是引用或者指針,否則不改變傳進來的變數值)
『柒』 C語言的全排列問題!急!
這其實是一個遞歸
遞歸函數
意思是這樣的
比如有n個數
1
2.。。。n
把1
從第一個開始
往後
與每個數開始交換
然後
第一個數就算定了
後面的
第2個到第n個當成一個整體
再進行這個函數遞歸
也就是說
第二個到第n個進行全排列
這樣下去
當全排列到最後一組數
即第n個數一個的時候
遞歸退出條件就出來了
就可以輸出全排列的值了
當然
最後別忘記把交換的數還原
再進行下一次交換
遞歸哦
所以最後一局的交換也是很重要的
聽完我的解釋
再好好琢磨一下
相信你一定會明白的
要是還是不懂可以繼續追問我
『捌』 c語言中全排列問題
//輸入一個數輸出這個數所有的排列,遞歸做法
#include<stdio.h>
int a[100];
int n;
void output()
{
int i;
for(i=1;i<=n;i++)
printf("%3d",a[i]);
printf("\n");
}
void Swap(int &a,int &b) //注意取地址
{
int t;
t=a;
a=b;
b=t;
}
void pailie(int t)
{
int i;
if(t==n) //輸出
{
output();
return ;
}
for(i=t;i<=n;i++)
{
Swap(a[i],a[t]); //交換
pailie(t+1);
Swap(a[t],a[i]); //換回
}
}
int main()
{
int i;
while(scanf("%d",&n)!=EOF&&n!=0)
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
pailie(1);
}
return 0;
}