再帰-文字列のすべての組み合わせ(コード、分析、アセンブリ)を出力します

コード:

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

分析:

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

コンパイル:

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/m0_37599645/article/details/111986246