Recursion-output all combinations of strings (code, analysis, assembly)

table of Contents:

Code:

#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;
}

analysis:

Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here

compilation:

Insert picture description here
Insert picture description here
Insert picture description here

Guess you like

Origin blog.csdn.net/m0_37599645/article/details/111986246