zoukankan      html  css  js  c++  java
  • 递归复习,递归输出字符串的全排列

    /*
    例子123进行全排列,那么包含以下几部分
    1)1是第一位的时候,对剩下的2,3进行全排列;
    2)2是第一位的时候(将2和1交换),对剩下的1,3进行全排列;
    3)3是第一位的时候(将3和1交换),对剩下的1,2进行全排列;
    可以看到,每次递归是后面的值和起始位置交换,但每次都要保证原始顺序不变(不然不能保证和1进行交换)
    所以第一次交换是每次将后面的值一次交换到起始位置,再对后面的进行全排列;
    第二次的交换是要将前面的交换再交换回来,保证最初的原始排列不发生变化。
     */
    #include<iostream>
    using namespace std;
    
    template <class Type>
    void Perm(Type list[], int k, int m) //list[k...m]
    //k和m分别表示要进行全排列的元素范围,即两个端点的index,k为开始的index,m为结束端点index。 
    {
    	if(k==m)                       
    	{
    		for(int i=0; i<=m; i++)
    			cout << list[i];
    		cout << endl;
    	}
    	else
    		for(int j=k; j<=m; j++)
    		{
    			Swap(list[k],list[j]);
    			Perm(list, k+1, m);
    			Swap(list[k],list[j]);
    		}
    }
    
    template<class Type>
    inline void Swap(Type &a, Type &b)
    {
    	Type temp=a;
    	a=b;
    	b=temp;
    }
    
    int main(){
    	char ch[]="abc";
    	Perm(ch,0,3);
    
    }



    原理就是

    perm(abc)=  a + perm(bc) ---a和a换,然后计算子问题,计算完了还原

        + b + perm(ac) --- a和b换,同上

        + c + perm(ba) --- a和c换,同上

    子问题依此类推。

    三个组合起来用for循环来处理。

    for(int j=k; j<=m; j++)
    		{
    			Swap(list[k],list[j]);//将问题第一个元素和 [j] 交换。
    			Perm(list, k+1, m);// 计算子问题 即除了第一个元素的后面的全排列。
    			Swap(list[k],list[j]);//然后把 第一个元素 和[j]再换回来。
    		}

    for循环 是 把 多个 递归 累加起来的。



  • 相关阅读:
    less中遇到的一些特殊的写法
    观察者模式
    发布订阅模式
    javascript中的函数
    关于js中this的理解和作用
    [Oracle]Oracle镜像安装及使用教程
    log4net日志配置
    过滤器
    .net core 处理 中文乱码
    Fromform
  • 原文地址:https://www.cnblogs.com/slankka/p/9158546.html
Copyright © 2011-2022 走看看