通过递归实现嵌套未知次数的循环

原创 2017年09月06日 13:38:57

如下示例:

public class Test4 {

    public static void main(String[] args) {

        int m = 10;
        int n = 9;
        int p = 4;
        int q = 7;

        for(int i=0;i<m;i++){
            int a = i;
            for(int j=0;j<n;j++){
                int b = j;
                if(b==a){
                    continue;
                }
                for(int k=0;k<p;k++){
                    int c = k;
                    if(c==b || c==a){
                        continue;
                    }
                    for(int l=0;l<q;l++){
                        int d = l;
                        if(d==c || d==b || d==a){
                            continue;
                        }
                        System.out.println("["+i+", "+j+", "+k+", "+l+"]");
                    }
                }
            }
        }

    }

}

如果嵌套循环个数是动态指定的,那么,通过上面的方式就无法实现了,以上的方式只能在确定嵌套循环的个数的情况下奏效。

怎么破,使用递归可以巧妙解决上述的场景,代码如下:

import java.util.Arrays;

public class Test5{

    public static void main(String[] args) {
        recurse(new int[] {5, 2, 4}, new int[3], 0);
    }


    public static void recurse(int[] a, int[] b, int depth) {
        if (depth == a.length) {
            System.out.println(Arrays.toString(b));
            return;
        }

        outer:
        for (int i = 0; i < a[depth]; i++) {
            for (int j = 0; j < depth; j++) {
                if (i == b[j]) {
                    continue outer;
                }
            }
            b[depth] = i;
            recurse(a, b, depth + 1);
        }
    }

}

对比一下可以看出:通过递归实现的代码非常简洁和优雅,但是效率也是很差的,尤其是当循环的次数和嵌套的深度都很大的话。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zkn_CS_DN_2013/article/details/77865335

kmp模式匹配算法的pascal实现

{  Implementation of KMP Algorithm}PROGRAM Impl_KMP;USES    CRT;CONST     MAX_STRLEN = 255;VAR   nex...
  • idler
  • idler
  • 2001-08-17 10:45:00
  • 1188

未知循环层数的递归处理

未知循环层数的递归处理
  • qq_18153015
  • qq_18153015
  • 2016-11-11 16:32:32
  • 378

动态决定嵌套循环层数的方法

1使用递归 void cycle(int sCnt ,int zCnt){ return ; sCnt--; if(sCnt == 0 && zCnt ==0) { return; } ...
  • songqqnew
  • songqqnew
  • 2015-09-12 09:02:12
  • 1345

利用递归来模拟多重嵌套循环.

//利用递归来模拟多重嵌套循环. 如以下循环: 1 2 3 4 5 6 for(int i=0;i     for(int j...
  • u013797304
  • u013797304
  • 2016-07-18 22:42:46
  • 2534

嵌套for循环在不减少循环次数下的优化

测试代码: public class Test { public static void main(String[] args) { System.out.println("嵌套for循环,内小外大消...
  • qq_29158381
  • qq_29158381
  • 2016-03-09 17:17:04
  • 1029

一个matlab里的排列组合或者说是循环嵌套的层数不定的问题

我要完成类似这么一个工作:我有一个n维的坐标,[a,b,c....n]坐标的范围已知,如何将所有的坐标都填到一个矩阵里去,举例说明,假设有[a,b,c]取值在[3,3,3]到[4,4,4]之间,那么应...
  • u011013580
  • u011013580
  • 2016-07-01 10:59:44
  • 1351

Thymeleaf嵌套循环,每次循环显示固定数量

前言项目中前端要实现滚屏展示,即一屏展示七个,从六屏。刚开始直接外层一个sequence进行六屏循环,内层直接拿数据对象each,发现不行,只能取7个,很是惆怅。后来google了半天,结合自己的一些...
  • u014042066
  • u014042066
  • 2017-08-08 14:59:26
  • 3868

嵌套循环(循环多次输出)

includeint main() {     int i,j,n;     long p,sum=0;      while(1)  {     printf("intput n...
  • xg17_38241417124
  • xg17_38241417124
  • 2017-11-07 19:48:13
  • 367

freemaker嵌套

danwei_index}">                         ${danwei.orgname!}                                      ...
  • bdy9600
  • bdy9600
  • 2017-02-09 09:24:47
  • 187

thinkphp中volist或者foreach循环嵌套层数如何修改使得超过3层

thinkphp中volist或者foreach默认设定了嵌套最多只支持3层,因此需要修改其文件。 修改core\Library\Think\Template\TagLib下的Cx.clas...
  • dl425134845
  • dl425134845
  • 2015-01-06 13:56:48
  • 2497
收藏助手
不良信息举报
您举报文章:通过递归实现嵌套未知次数的循环
举报原因:
原因补充:

(最多只允许输入30个字)