JavaScript递归详述

目录
  • 一、什么是递归?
  • 二、利用递归求数学题
    • 1、求1 * 2 * 3 * 4 …*n的阶乘
    • 2、 求斐波那契数列
  • 三、利用递归求对应数据对象

一、什么是递归?

如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。简单理解:函数内部自己调用自己, 这个函数就是递归函数。

如下所示:

function fn(){
 fn();
}
fn();

这个函数就是一个递归函数,当我们直接打印时,会:

发现打印错误,这是为什么呢?因为递归函数的作用和循环效果一样。当没有给他返回值的时候,它就会一直死循环下去。所以,我们知道了:

由于递归很容易发生“栈溢出”错误(stack overflow),所以必须要加退出条件 return

那正确的递归函数应该怎样写呢?以上述代码为例:比如我们现在要打印五遍‘你好',这时,我们应该这样来写:

var num = 1;
function fn(){
            console.log('你好');
            if(num == 5){
                return;
            }
            num++;
            fn();
        }
        fn();

打印结果为:

知道了递归是什么,那我们再来看看如何利用递归解决问题吧!

二、利用递归求数学题

1、求1 * 2 * 3 * 4 …*n的阶乘

代码如下:

 function fn(n){
           if(n == 1){
               return 1;
           }
           return n*fn(n-1);
       }
       console.log('1-20的阶乘为:'+fn(20));
       console.log('1-10的阶乘为:'+fn(10));
       console.log('1-5的阶乘为:'+fn(5));

打印结果为:

2、 求斐波那契数列

斐波那契数列,又称为“兔子数列”,指的是这样一个数列:、1、1、2、3、5、8、13、21、34、……,即第三项的值为前两项的加和。用户输入一个n,就可以得到该位置的数。

代码如下:

function fb(n){
            if(n === 1 || n === 2){
                return 1;
            }
            return fb(n-1) + fb(n-2);
        }
       console.log('第3项斐波那契数列值为:'+fb(3));
       console.log('第10项斐波那契数列值为:'+fb(10));

打印结果为:

三、利用递归求对应数据对象

根据id返回对应的数据对象

有如下所示的对象:

        var date = [{
            id:1,
            name:'电器',
            goods:[{
                id: 11,
                gname:'手机'
            },{
                id: 12,
                gname: '电脑'
            }]
        },{
            id:2,
            name:'服饰',
            goods:[{
                id : 21,
                gname:'裤子'
            },{
                id : 22,
                gname : '外套'
                }]
        },{
            id : 3,
            name: '食品'
                }];

现在要通过输入id返回对应的数据对象。

首先我们可以通过for...Each()来遍历数组,得到每一项值,如下所示:

function getId(array,id){
                    array.forEach(function(value){
                        console.log(value);
                    })
                }
                getId(date,1);

打印的结果为:

这时,如果我们想要获得id为1的对象的值,可以这样操作:

function getId(array,id){
                    array.forEach(function(value){
                       if(value.id === id){
                           console.log(value);
                       }
                    })
                }
                getId(date,1);

打印结果为:

可以得到,但是如果我们想要得到id为11的对象的值呢?很明显,直接调用该函数是不可行的,因为我们通过for...Each只是遍历得到了最外层的对象的值,而内层的具体分类并没有得到,这时,我们就可以通过递归调用getId(array,id)函数,来获取里层对象的值。

操作如下:

 function getId(array,id){
                    array.forEach(function(value){
                       if(value.id === id){
                           console.log(value);
                       }else if(value.goods && value.goods.length !=0){
                            getId(value.goods,id);
                       }

                    })
                }
                // getId(date,1);
                getId(date,11);

打印的结果为:

到此这篇关于JavaScript递归详述的文章就介绍到这了,更多相关JavaScript递归内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • javascript递归函数定义和用法示例分析

    递归函数:是指函数直接或间接调用函数本身,则称该函数为递归函数. 这句话理解起来并不难,从概念上出发,给出以下的例子: function foo(){ console.log("函数 foo 是递归函数."); foo(); } 这个例子的 foo 函数就是一个递归函数. 当你把这个函数拿到浏览器上运行的时候,你会发现内存溢出了,为什么呢?因为这个递归函数没有停止处理或运算的出口,因此这个递归函数就演变为一个死循环. 那如何使用递归呢? 使用递归函数必须要符合两个条件: 1. 在每一次

  • JavaScript递归函数定义与用法实例分析

    本文实例讲述了JavaScript递归函数定义与用法.分享给大家供大家参考,具体如下: 递归函数是一个函数通过名字调用自身的情况下形成的,比如经典的递归阶乘函数: function factorial(num) { if (num <= 1) { return 1; } else { return num * factorial(num - 1); } } 上面的这种写法,可能会造成问题: var anotherFactorial = factorial; factorial = null; c

  • JavaScript递归操作实例浅析

    本文实例分析了JavaScript递归操作.分享给大家供大家参考,具体如下: 问题 一个简单的递归,求n的阶乘: function factorial(n){ if (n<=1) { return 1; }else{ return factorial(n-1)*n; } } 如果像下面这样使用它,则会出错: var fcopy = factorial; factorial = null; alert(fcopy(3)); 因为fcopy指向的函数实体调用了factorial,而factorial

  • 关于JavaScript递归经典案例题详析

    目录 什么是递归,它是如何工作的? 一.求和 (1)数字求和 (2)数组求和 二.数据转树 三.汉诺塔 四.斐波那契数列 总结 什么是递归,它是如何工作的? 我们先来看一下递归(recursion)的定义: 递归是一种解决问题的有效方法,在递归过程中,函数将自身作为子例程调用. 简单说程序调用自身的编程技巧叫递归.递归的思想是把一个大型复杂问题层层转化为一个与原问题规模更小的问题,问题被拆解成子问题后,递归调用继续进行,直到子问题无需进一步递归就可以解决的地步为止. 使用递归需要避免出现死循环,

  • JavaScript递归详述

    目录 一.什么是递归? 二.利用递归求数学题 1.求1 * 2 * 3 * 4 -*n的阶乘 2. 求斐波那契数列 三.利用递归求对应数据对象 一.什么是递归? 如果一个函数在内部可以调用其本身,那么这个函数就是递归函数.简单理解:函数内部自己调用自己, 这个函数就是递归函数. 如下所示: function fn(){ fn(); } fn(); 这个函数就是一个递归函数,当我们直接打印时,会: 发现打印错误,这是为什么呢?因为递归函数的作用和循环效果一样.当没有给他返回值的时候,它就会一直死循

  • Javascript递归打印Document层次关系实例分析

    本文实例讲述了Javascript递归打印Document层次关系的方法.分享给大家供大家参考.具体如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>递归显示节点层次关系</titl

  • 一个JavaScript递归实现反转数组字符串的实例

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>每天一个JavaScript实例-递归实现反转数组字符串</title> <script> var func = function(x,indx,str){ return

  • 优雅的使用javascript递归画一棵结构树示例代码

    递归和尾递归 简单的说,递归就是函数自己调用自己,它做为一种算法在程序设计语言中广泛应用.其核心思想是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解.一般来说,递归需要有边界条件.递归前进阶段和递归返回阶段.当边界条件不满足时,递归前进:当边界条件满足时,递归返回. 但是作为一个合格的程序员,我们也因该知道,递归算法相对常用的算法如普通循环等,运行效率较低.因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候.在递归调用的过程当中系统为每一层的

  • javascript递归回溯法解八皇后问题

    下面给大家分享的是回溯法解八皇后, 带详细注解,这里就不多废话了. function NQueens(order) { if (order < 4) { console.log('N Queens problem apply for order bigger than 3 ! '); return; } var nQueens = []; var backTracking = false; rowLoop: for (var row=0; row<order; row++) { //若出现ro

  • Javascript如何递归遍历本地文件夹

    打印本地temp folder所有的文件及最后修改时间: <html> <head> <script language="javascript"> var s = ""; var result = []; function FileInfo(path, name,time) { this.path = path; this.name = name; this.time = time; } function showFolderFi

  • 深入了解JavaScript中递归的理解与实现

    目录 前言 递归的基本理解 实例解析 求斐波那契数 时间复杂度分析 空间复杂度分析 执行顺序分析 前言 我们在写业务代码的时候,或多或少都会遇到需要使用递归的场景,比如在遍历树形结构时. 本文将通过递归的经典案例:求斐波那契数来讲解递归,通过画递归树的方式来讲解其时间复杂度和空间复杂度以及递归的执行顺序,欢迎各位感兴趣的开发者阅读本文. 递归的基本理解 表象理解 函数会自己调用自己 每一次调用,函数的参数都会收敛变小 实质理解 把一个大问题变成1个或n个小问题 用同样的逻辑来解决这些问题 最后把

  • JavaScript中关于递归与回溯的实例详解

    目录 何为递归 构成递归条件 关于回溯 实际业务 组合问题 何为递归 递归作为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无限集合.需要注意的是,递归必须要用边界条件,否则很容易导致死循环 构成递归条件 子问题须与原始问题为同样的事,且更为简单

随机推荐