循环 vs 递归浅谈

比如遍历以下一维数组:

代码如下:

[javascript] view plaincopyprint?
var a1 = [1]; 
var a2 = [1, 2]; 
var a3 = [1, 2, 3];

虽然它们长度不一,但循环应付它们非常容易,也很优雅:

代码如下:

[javascript] view plaincopyprint?
var dumpArrayByLoop = function(a) { 
    for (var i = 0; i < a.length; i++) { 
        println(a[i]); 
    } 
};

如果改用递归,则看起来比较别扭:

代码如下:

[javascript] view plaincopyprint?
var dumpArrayByRecur = function(i, a) { 
    if (i < a.length) { 
        println(a[i]); 
        dumpArrayByRecur(i + 1, a); 
    } 
};

它们能输出同样的结果,但相比之下递归版本看起来很笨拙。

现在想想,如果元数据变化了:维度扩大到二维。

代码如下:

[javascript] view plaincopyprint?
var a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];

此时需要再外面再套一层循环变成双重循环:

代码如下:

[javascript] view plaincopyprint?
var dumpArrayByLoop = function(a) { 
    for (var i = 0; i < a.length; i++) { 
        for (var j = 0; j < a[i].length; j++) { 
            println(a[i][j]); 
        } 
    } 
};

如果数据的维度再继续扩大,变成三维、四维……甚至动态的N维数组。使用循环该怎么处理呢?

在这种“层数”很深,甚至不确定的情况下,就需要用“递归”来解决跨“层”的问题。

代码如下:

[javascript] view plaincopyprint?
var isArray = function(a) { 
    return Object.prototype.toString.call(a) === '[object Array]'; 
};

var dumpArrayByRecur = function(a) { 
    if (isArray(a)) { 
        for (var i = 0; i < a.length; i++) { 
            dumpArray(a[i]); 
        } 
    } else { 
        println(a); 
    } 
};

上面的代码中,如果发现子节点是一个数组,就使用递归进入下一层;而同一层上的遍历则使用循环来完成。

(0)

相关推荐

  • 循环 vs 递归浅谈

    比如遍历以下一维数组: 复制代码 代码如下: [javascript] view plaincopyprint?var a1 = [1];  var a2 = [1, 2];  var a3 = [1, 2, 3]; 虽然它们长度不一,但循环应付它们非常容易,也很优雅: 复制代码 代码如下: [javascript] view plaincopyprint?var dumpArrayByLoop = function(a) {      for (var i = 0; i < a.length;

  • 浅谈选择、冒泡排序,二分查找法以及一些for循环的灵活运用

    如下所示: import java.util.Arrays; //冒泡排序 public class Test { public static void main(String[] args) { int[] array = { 31, 22, 15, 77, 52, 32, 18, 25, 16, 7 }; // 冒泡 --> 两两比较 --> 提取出最大的数 在最后一位 //拿第一位和它后面的一位进行 两两比较 System.out.println(Arrays.toString(arra

  • Python入门_浅谈for循环、while循环

    Python中有两种循环,分别为:for循环和while循环. 1. for循环 for循环可以用来遍历某一对象(遍历:通俗点说,就是把这个循环中的第一个元素到最后一个元素依次访问一次).for循环的基本结构如下: 具体看这个案例: 设计一个函数,在桌面创建10个文本,用数字从1-10依次给它们命名. def text_create(): path = '/Users/duwangdan/Desktop/' for text_name in range(1,11): # 1-10的范围需要用到r

  • 浅谈js中的in-for循环

    浅谈js中的in-for循环 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script type="text/javascript" src="jquery.js"></script> </hea

  • 浅谈java中对集合对象list的几种循环访问

    java中对集合对象list的几种循环访问的总结如下  1 经典的for循环 public static void main(String[] args) { List<String> list = new ArrayList(); list.add("123"); list.add("java"); list.add("j2ee"); System.out.println("=========经典的for循环=======

  • 浅谈java 增强型的for循环 for each

    For-Each循环 For-Each循环也叫增强型的for循环,或者叫foreach循环. For-Each循环是JDK5.0的新特性(其他新特性比如泛型.自动装箱等). For-Each循环的加入简化了集合的遍历. 其语法如下: for(type element: array) { System.out.println(element); } 例子 其基本使用可以直接看代码: 代码中首先对比了两种for循环:之后实现了用增强for循环遍历二维数组:最后采用三种方式遍历了一个List集合. i

  • 浅谈python for循环的巧妙运用(迭代、列表生成式)

    介绍 我们可以通过for循环来迭代list.tuple.dict.set.字符串,dict比较特殊dict的存储不是连续的,所以迭代(遍历)出来的值的顺序也会发生变化. 迭代(遍历) #!/usr/bin/env python3 #-*- coding:utf-8 -*- vlist=['a','b','c'] vtuple=('a','b','c') vdict={'a': 1, 'b': 2, 'c': 3} vset={'a','b','c'} vstr='abc' for x in vl

  • 浅谈php中的循环while、do...while、for、foreach四种循环

    php中的while循环,循环执行代码块制定的次数,或者当指定的条件为真时循环执行代码块. ------------------------------------------------------------- 在我们编写代码是时候,我们经常需要一块代码块重复执行多次.我们就可以使用while循环语句来完成这个任务. while--只要指定条件成立,则循环执行代码块. do...while--首先执行一次代码块,然后在指定的条件成立时重复这个循环. for--循环执行代码块制定的次数. fo

  • 浅谈js for循环输出i为同一值的问题

    1.最近开发中遇到一个问题,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5. 代码如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>闭包演示</title> </head> <body> <p>1<

  • 浅谈JavaScript for循环 闭包

    有个网友问了个问题,如下的html,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5. <html > <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>闭包演示</title> <script type="text/javascript&quo

随机推荐