循环 vs 递归

注:本文代码使用 JavaScript。

一些同学对递归的理解还停留在“是一种求阶乘比循环低效的方法”。但其实递归和循环处理的问题是不同。拿“遍历数组”这个问题来说:循环适合同一维度(单层长度不限)上的遍历,而递归则适合跨维度(层数不限)的遍历。

比如遍历以下一维数组:

var a1 = [1];
var a2 = [1, 2];
var a3 = [1, 2, 3];

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

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

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

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

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

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

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

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

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维数组。使用循环该怎么处理呢?

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

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

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

时间: 2024-11-03 17:51:12

循环 vs 递归的相关文章

java循环匹配递归的问题

问题描述 java循环匹配递归的问题 wuxian递归的问题 wuxian递归的问题wuxian递归的问题wuxian递归的问题 wuxian递归的问题wuxian递归的问题 wuxian递归的问题 wuxian递归的问题wuxian递归的问题 wuxian递归的问题 解决方案 ?解决方案二: 这是基本的java问题啊,flag是值拷贝,你在函数里无论怎么改变,出来当然不对, private static int digui(String displayName, ArrayList> obje

求帮助-sqlserver 计算循环,递归循环的算法

问题描述 sqlserver 计算循环,递归循环的算法 解决方案 http://www.cnblogs.com/cracker/archive/2012/07/07/2580781.html 解决方案二: 如上图 1到2 2到3 3到4 4到1 如何计算1到4是如何连接的 解决方案三: 循环和递归在算法中的应用循环和递归在算法中的应用

一步一步写算法(之循环和递归)

原文:一步一步写算法(之循环和递归) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com]     其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容.当然,如果循环还好理解一点,那么递归却没有那么简单.我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕.所谓的递归就是函数自己调用自己而已,循环本质上也是一种递归.     1)求和递归函数     我们可以举一个循环的例子,前面我们说过,如果编写一个1到n的求和

算法系列(十五) 循环和递归在算法中的应用

一.递归和循环的关系 1. 递归的定义 顺序执行.循环和跳转是冯·诺依曼计算机体 系中程序设计语言的三大基本控制结构,这三种控制结构构成了千姿百态的算法,程序,乃至整个软件世 界.递归也算是一种程序控制结构,但是普遍被认为不是基本控制结构,因为递归结构在一般情况下都可 以用精心设计的循环结构替换,因此可以说,递归就是一种特殊的循环结构.因为递归方法会直接或间接 调用自身算法,因此是一种比迭代循环更强大的循环结构. 2. 递归和循环实现的差异 循 环(迭代循环)结构通常用在线性问题的求解,比如多项

循环 vs 递归浅谈_javascript技巧

比如遍历以下一维数组: 复制代码 代码如下: [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

递归 循环-利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来

问题描述 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来 程序如下,我在main中添加了一个循环,能够多次输入,但是第二次输入返回值只有4个,断点监控后发现第二次循环开始后跳过了else里的next=getchar(),直接执行palin(n-1),不知道为什么,求大神指点! PS.我用的是vs2010 void palin(int n) { char next; if(n<=1) { next=getchar(); printf("n:"); putchar(ne

C语言循环与递归实现整数幂函数

递归在C 关于递归中讲过了一些知识,但是在写的时候我还是遇到了一些麻烦,而普通的循环却比较好想. 先来看看普通的版本:  代码如下 复制代码 #include <stdio.h> double power(double n, double p); int main(void) {  double n, p;  printf("Please input the number you need to power: ");  scanf("%lf", &

循环、递归、概率

递归是程序设计中的一种算法.一个过程或函数直接调用自己本身或通过其他的过程或函数调用语句间接地调用自己的过程或函数,称为递归过程或函数. 例子一:打靶 面试1:一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能性有多少种? 解析:靶上一共有10种可能--1环到10环,还有可能脱靶,那就是0环,加在一起公有11种可能. 方法1:使用循环 for(i1=0;i1<=10;i1++) for(i2=0;i2<=10;i2++) for(i3=0;i3<=10;i3++) ... f

java-Java中递归快还是循环快?

问题描述 Java中递归快还是循环快? Java中递归快还是循环快? 还是有什么适用情况? 例如求100万的阶乘 解决方案 数据小的话用递归,数据大还是用循坏吧,毕竟递归太消耗内存 解决方案二: 这个要做性能测试,代码会可能被优化,所以递归,循环都可能有优化. 解决方案三: 循环快,逻辑简单些. 解决方案四: 一般来说循环都比递归要快点. 解决方案五: 这个的测试一下,但是我觉得是递归简单. 解决方案六: 一般解决同一个问题最好选择循环,递归比较消耗内存 解决方案七: 原则上能用循环解决的不用递