zoukankan      html  css  js  c++  java
  • 从全排列看递归

    1、什么是递归

         1)举个生活中的例子:假设有一项很繁重的工作,我们总能把它划分为:总工作量=今天的工作+剩下的工作,只要我们每天都在坚持,一点点继续,那么剩下的工作会越来越少,总有一天,我们可以实现我们的梦想!(程序员的自我安慰~)

         2)数学上来看:

             例如:n的阶乘 f(n) = n!,n为整数

                     f(n) = 1   n<= 1                       (1)

                              n*f(n-1) n >1                  (2)

      • 有一个基础部分:它包含一个或多个值,对这些值,f(n)是直接定义的,如(1)。
      • 在递归部分,右侧有一个参数小于n,因此重复应用递归部分,可以把右侧f的表达式转变为基础部分,如(2)。    
      • 从整体来看,递归运行的过程,像归纳证明的逆过程      

    2、从全排列看递归

       改一个字符数组,输出由这些字符组成的全排列:

            

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    template <class T>
    void print(T*p,int num)
    {
        for(int i = 0;i < num;i++)
        {
            cout<<p[i]<<" ";
        }
        cout<<endl;
    }
    
    template <class T>
    void permutations(T *p,int first,int last)
    {
        if(first == last)   //当first = last,p[first:last]只有一个全排列
           print(p,last+1);
        else{               // p[first:last] 有多于一个排列,递归生成这些排列
            for(int i = first;i <= last;i++)
            {
                swap(p[i],p[first]);
                permutations(p,first+1,last);
                swap(p[i],p[first]);
            }
        }
    
    }
    
    
    int main()
    {
        cout << "please enter the numbers!" << endl;
        char num;
        int countNum = 0;
        char arrayNum[1000];
        while(cin >> num && num != '0')
        {
            arrayNum[countNum] = num;
            countNum++;
        }
        cout<<endl;
        permutations(arrayNum,0,countNum-1);
        return 0;
    }

       

  • 相关阅读:
    MVC对session或cookie保存的值在js中做处理
    JQuery判断是否是移动端
    C# Guid 和 JQuery Guid
    JQuery Cookie操作
    DES置换表加密
    RSA的基础运算
    minikatz免杀之msf加载bin文件
    minikatz免杀之Out-EncryptedScript加密
    vue 多选框
    小程序加载更多,上拉刷新
  • 原文地址:https://www.cnblogs.com/1995hxt/p/5598459.html
Copyright © 2011-2022 走看看