由全排列问题引发的关于for循环里嵌套递归的思考

由全排列问题引发的关于for循环里嵌套递归的思考


问题描述:求n个整数的全排列。


解决思路:

输入:n个整数的序列

步骤1:置i=0。

步骤2:置第i个位置的元素当排头。

步骤3:递归求除排头元素外的n-1个元素的全排列。

步骤4:将排头归回第i个位置。

步骤5:i++。

步骤6:如果i<n,则转步骤2;否则结束。


package improve;

import java.util.Scanner;

public class Test2
{
   public static  void main(String[]args)
   {
       Scanner scanner=new Scanner(System.in);
       int n=scanner.nextInt();
       int A[]=new int[n];
       for(int i=0;i<n;i++)
       {
           A[i]=scanner.nextInt();
       }
       perm(A,0,n);
   }
   public static void perm(int A[],int k,int n)
   {

       if(k==n)
       {
           for(int i=0;i<n;i++)
               System.out.print(A[i]+"-");
       }
       else {
           for(int i=k;i<n;i++)
           {
               //实现A[i]与A[k]的交换
               int temp=A[i];
               A[i]=A[k];
               A[k]=temp;
               //递归
               perm(A,k+1,n);
               //实现A[i]与A[k]的交换
               int temp2=A[i];
               A[i]=A[k];
               A[k]=temp2;

           }
       }
   }
}


其中一种输入情况以及输出:

输入n=3

A[3]=[1,2,3]

输出为:1-2-3-1-3-2-2-1-3-2-3-1-3-2-1-3-1-2-


原来,自己分析不清循环中嵌套递归到底怎么理解,后来,通过下面的这个小例子对这个问题有了一定的理解。

package improve;

import java.util.Scanner;

public class Test3
{
   public static void main(String[]args)
   {
       Scanner scanner=new Scanner(System.in);
       int i=scanner.nextInt();
       int n=scanner.nextInt();
       digui(i,n);

   }

   public static void digui(int i,int n)
   {
       System.out.print("A");
       for( i=i+1;i<n;i++)
       {
           System.out.print(i);
           digui(i+1,n);
           System.out.print("B");
       }
   }
}


测试:

输入:1 3
输出:A2AB


分析:开始调用digui方法时,i=1,n=3,执行输出A,进入循环,i=1+1=2;2<3成立,所以输出2,此时调用方法digui(i+1,n),i+1=3 n=3;再次输出A,再次进入for循环,i=i+1=4;4<3不成立,所以此时没有再进入循环体,结束递归,执行输出B。

如果把n改为4,结果将变得复杂很多。

以这样的理解方式去理解递归法求全排列应该会简单很多。










  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuhuimingc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值