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

原创 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);
        }
    }

}

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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

for循环里面的递归调用探讨

递归本来要来简化循环问题的,不过程序中往往却有for加递归一起使用的情况。我们在for里面堪套for,或者for里面的for再堪套for,都能很直观地理解。当for里面加入了递归,理解的层面就由三维跳...
  • mikayong
  • mikayong
  • 2016年06月18日 22:54
  • 4991

递归转循环的通用方法

1.递归 定义:程序调用自身的编程技巧称为递归。 栈与递归的关系:递归是借助于系统栈来实现的。每次递归调用,系统都要为该次调用分配一系列的栈空间用于存放此次调用的相关信息:返回地址,局部变量等。当调用...
  • u010228612
  • u010228612
  • 2016年04月18日 20:49
  • 3414

关于递归次数的计算

有这样一个题目: 递归函数: 1 int x(int n) 2 { 3 if(n3) 4 { 5 return 1; 6 } 7 ...
  • u013018721
  • u013018721
  • 2016年04月08日 12:48
  • 2294

for循环里面的递归

for循环里面的递归调用探讨 递归本来要来简化循环问题的,不过程序中往往却有for加递归一起使用的情况。 我们在for里面堪套for,或者for里面的for再堪套for,都能很直观地理...
  • qq_18884827
  • qq_18884827
  • 2016年08月08日 17:47
  • 1365

递归处理多层嵌套列表

建立一个多层列表(即列表中存储列表)并输出列表项 如下图: 可以看出输出的只是输出了外列表 当然也可以多次循环输出每一个子项:如下图所示 注:isinstance(object...
  • a308690341
  • a308690341
  • 2014年04月25日 15:50
  • 70118

artTemplate嵌套使用(二)

先展示json数据的组成:public void getAllTanWeiAndTanWeiDetail(){ List plist=this.tanWeiService.getAll...
  • u012948731
  • u012948731
  • 2015年08月21日 23:54
  • 7991

递归调用效率问题,递归与循环比较

1.所谓的递归慢到底是什么原因呢? 大家都知道递归的实现是通过调用函数本身,函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的。具体是每次调用函数本身要保存的内容包括:...
  • u010359965
  • u010359965
  • 2015年08月04日 21:58
  • 1873

循环次数未知的单重循环程序设计

题目描述在一个以buf为首址的字节存储区中, 存放着一个以$作为结束标志的字符串, 试编写程序, 在屏幕上显示该字符串, 并要求将小写字母转换为大写字母显示。题目解答直接看代码.386 stack s...
  • dfq12345
  • dfq12345
  • 2017年04月03日 21:26
  • 292

在 XSLT 中用递归实现循环

原文地址:https://www.ibm.com/developerworks/cn/xml/x-tiploop.html 扩展 XSLT 能力的技术 XSLT 是一种函数式编程语...
  • u010523770
  • u010523770
  • 2017年05月04日 22:41
  • 357
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过递归实现嵌套未知次数的循环
举报原因:
原因补充:

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