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

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

}

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

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

相关文章推荐

斐波那契数列的递归,迭代(循环),通项公式三种实现

所谓Fibonacci数列是指这样一种数列,它的前两项均为1,从第三项开始各项均为前两项之和。用数学公式表示出来就是:           1     ...

二分查找法(递归与循环实现)

问题:  给定一个排序数组和一个数k,要求找到第一个k的位置和最后一个k的位置 解析: 由于给定的数组是从小到大排序的,故可以按照二分查找法来找,下面分别从递归和循环两种方法来阐述: //递归方法 i...

初步实现无循环(则递归)将任意整数转任意进制字符串

不用循环的算法可以寻求递归来实现。 对于这个最大整数转为二进制时递归最深,64位64倍固定栈大小?。 itoa将num按radix进制转换字符串到rec_array缓冲区,其中缓冲区未检测。 #...

斐波那契数列的递归,迭代(循环),通项公式三种实现

Fibonacci数列是指这样一种数列,它的前两项均为1,从第三项开始各项均为前两项之和。用数学公式表示出来就是:                1 ...

保存图片到本地,查看本地图片,递归实现scrollView的无限循环滚动,文字横向渐变效果,autoLayout

// // ViewController.m // DiGui // // Created by test on 16/3/28. // Copyright © 2016年 Zhou. All...

JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)

import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue;...

用两种递归思路与循环实现单链表的反转

typedef struct ListNode{ int data; struct ListNode *next; }ListNode; //递归一 ListNode *ReverseList ...
  • Enter_
  • Enter_
  • 2014-08-05 15:50
  • 1256

leetcode笔试题二叉树的前序、中序、后序遍历的递归和循环c++实现

#include #include #include using namespace std; struct binaryTreeNode { int ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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