目錄:
- 代碼:
- 分析:
- 匯編:
代碼:
#include <stdio.h>/*程序描述:輸出字符串所有的組合情況使用permutation函數進行將指定的下標值,與最大下標值這個范圍的每個下標值進行交換每調用一次permutation函數表示只處理指定下標的值,每次指定位置交換后,再調用b+1進行后面一個位置的交換,直到要交換的位置的與最大下標值相等時,表示沒得交換了輸出該字符串,這次的函數出棧返回調用處(就是處理前一個字符的地方),將前一個位置的字符恢復回沒交換的狀態,再將前一個字符與后面字符交換,如果還可以交換就再次調用permutatuion函數處理后面的字符,要是不可以處理該位置的permutation函數就出棧,返回再前一個位置再進行同樣操作總結:先從第一個字符處理,然后再每個字符調用permutation函數進棧,然后從倒數第二個開始與后面的交換沒得交換后,處理倒數第三個,再回去處理倒數第二個。可以交換就交換,不行就返回處理交換前一個再回去處理交換后面的。
*//*
調換字符函數 (輸出所有排列組合)
第一個參數:處理的字符串
第二個參數:要交換的下標在字符串中
第三個參數:可以交換最大值下標(字符串最后一個字符下標)
*/
void permutation(char s[], int b, int e)
{if( (0 <= b) && (b <= e) ){if( b == e )//如果調換的位置與最后一個字符位置相等時輸出字符串{printf("%s\n", s);}else{int i = 0;//用于與當前位置(b)做交換的位置for(i=b; i<=e; i++)//循環將當前位置與后面的每個位置的數據交換(包括自己本身){char c = s[b];//取當前位置的值s[b] = s[i];//將要交換的值賦給當前位置s[i] = c;//將當前位置值賦給交換的位置permutation(s, b+1, e);//將當前位置的下一個位置調用調換字符函數進行下個位置的交換c = s[b];//將上面當前位置交換后,再交換回來s[b] = s[i];s[i] = c;}}}
}int main()
{char s[] = "abc";permutation(s, 0, 2);getchar();return 0;
}
分析:
匯編: