递归-输出字符串所有的组合情况(代码、分析、汇编)
生活随笔
收集整理的這篇文章主要介紹了
递归-输出字符串所有的组合情况(代码、分析、汇编)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄:
- 代碼:
- 分析:
- 匯編:
代碼:
#include <stdio.h>/*程序描述:輸出字符串所有的組合情況使用permutation函數(shù)進行將指定的下標值,與最大下標值這個范圍的每個下標值進行交換每調(diào)用一次permutation函數(shù)表示只處理指定下標的值,每次指定位置交換后,再調(diào)用b+1進行后面一個位置的交換,直到要交換的位置的與最大下標值相等時,表示沒得交換了輸出該字符串,這次的函數(shù)出棧返回調(diào)用處(就是處理前一個字符的地方),將前一個位置的字符恢復(fù)回沒交換的狀態(tài),再將前一個字符與后面字符交換,如果還可以交換就再次調(diào)用permutatuion函數(shù)處理后面的字符,要是不可以處理該位置的permutation函數(shù)就出棧,返回再前一個位置再進行同樣操作總結(jié):先從第一個字符處理,然后再每個字符調(diào)用permutation函數(shù)進棧,然后從倒數(shù)第二個開始與后面的交換沒得交換后,處理倒數(shù)第三個,再回去處理倒數(shù)第二個。可以交換就交換,不行就返回處理交換前一個再回去處理交換后面的。 *//* 調(diào)換字符函數(shù) (輸出所有排列組合) 第一個參數(shù):處理的字符串 第二個參數(shù):要交換的下標在字符串中 第三個參數(shù):可以交換最大值下標(字符串最后一個字符下標) */ void permutation(char s[], int b, int e) {if( (0 <= b) && (b <= e) ){if( b == e )//如果調(diào)換的位置與最后一個字符位置相等時輸出字符串{printf("%s\n", s);}else{int i = 0;//用于與當前位置(b)做交換的位置for(i=b; i<=e; i++)//循環(huán)將當前位置與后面的每個位置的數(shù)據(jù)交換(包括自己本身){char c = s[b];//取當前位置的值s[b] = s[i];//將要交換的值賦給當前位置s[i] = c;//將當前位置值賦給交換的位置permutation(s, b+1, e);//將當前位置的下一個位置調(diào)用調(diào)換字符函數(shù)進行下個位置的交換c = s[b];//將上面當前位置交換后,再交換回來s[b] = s[i];s[i] = c;}}} }int main() {char s[] = "abc";permutation(s, 0, 2);getchar();return 0; }分析:
匯編:
總結(jié)
以上是生活随笔為你收集整理的递归-输出字符串所有的组合情况(代码、分析、汇编)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 疯狂之涌项链和谐了没
- 下一篇: 递归-计算字符串长度(代码、分析、汇编)