JS递归

作者: 苹果咏 | 来源:发表于2019-10-06 17:23 被阅读0次

一个函数在内部调用自己就叫递归,递归必须加退出条件

    //递归实现阶乘
    function fn(n){
        if(n == 1){
            return 1
        }
        return n * fn(n-1)
    }
    console.log(fn(7));
//斐波那契数列,1、1、2、3、5、8、13、21、34,第三项开始等于前两项之和
    function fb(n){
        if(n <= 2){
            return 1
        }
        return fb(n-1) + fb(n-2)
    }
    console.log(fb(8));
//利用递归获取数据
var data = [{
        id: 1,
        name: '家电',
        goods: [{
            id: 11,
            gname: '冰箱',
            goods: [{
                id: 111,
                gname: '海尔'
            }, {
                id: 112,
                gname: '美的'
            }, ]
        }, {
            id: 12,
            gname: '洗衣机'
        }]
    }, {
        id: 2,
        name: '服饰'
    }];
    function getGoods(array,id){
        var o = {}
        array.forEach(item => {
            if(item.id == id){
                o = item
            }else if(item.goods && item.goods.length > 0){
                o = getGoods(item.goods, id); 
            }
        });
        return o
    }
    console.log(getGoods(data,1));
    console.log(getGoods(data,11)); 
    console.log(getGoods(data,111)); 

可以使用arguments.callee代替函数名

//递归实现阶乘
    function fn(n){
        if(n <= 2){
            return n
        }
        return n * arguments.callee(n-1)
    }
    console.log(fn(7));

写递归分三步:
1、先去确定功能:
实现阶乘

2、找出结束条件,结束条件一般在很小的数去找

if(n <= 2){
  return n
}

3、找出函数的等价关系式:

f(n) = n * fn(n-1)

例子:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

1、确立功能:

跳上一个n级的台阶总共有多少种跳法

2、找出结束条件,往小了找

1级:(1)
2级:(1,1) (2)
3级:(1,1,1) (1,2) (2,1)
4级:(1,1,1,1) (1,1,2) (1,2,1) (2,1,1) (2,2)
第四级开始不一样了,前面三级都是返回n种,第四级5种
所以结束条件为:

if(n <= 3){
  return n
}
3、找出函数的等价关系式:

第一次跳1级,所以接下来还有n-1级阶梯,n-1级阶梯有f(n-1)种跳法
第一次跳2级,所以接下来还有n-2级阶梯,n-2级阶梯有f(n-2)种跳法
所以

f(n) = f(n-1) + f(n-2)
function fn(n){
  if(n <= 3){
    return n
  }
  return fn(n-1) + fn(n-2)
}

优化:

function fn(n){
    var arr=[]
    if(n <= 3){
        return n;
    }
    //先判断有没计算过
    if(arr[n]!=null){
        //计算过,直接返回
        return arr[n];
    }else{
        // 没有计算过,递归计算,并且把结果保存到 arr数组里
        arr[n] = fn(n-1) + fn(n-2)
        return arr[n];
    }
}

相关文章

  • 树形结构递归/原生js实现/vue递归组件

    原生js实现递归渲染 Vue2.0递归组件

  • 组件递归 & js递归

    一、el-tree实现原理—组件递归 举一个栗子: 1、组件引入,并调用。组件name为“func-table” ...

  • js递归

    递归 何为递归 递归,就是在运行的过程中调用自己,一般情况下多为函数自己调用自己。 构成递归需具备的条件 子问题须...

  • js递归

    递归 递归的概念在程序中函数直接或间接调用自己直接调用自己简介调用自己跳出结构,有了跳出才有结果思想递归的调用,最...

  • JS 递归

    函数递归Factorial称之为阶乘,维基百科是这样描述的“一个正整数的阶乘是所有小于及等于该数的正整数的积,并且...

  • js递归

    递归 递归的概念 在程序中函数直接或间接调用自己直接调用自己简介调用自己跳出结构,有了跳出才有结果 思想 递归的调...

  • JS递归

    一个函数在内部调用自己就叫递归,递归必须加退出条件 可以使用arguments.callee代替函数名 写递归分三...

  • js递归

    递归的理解 1.在函数内部调用自身 2.明确递归结束的条件一.阶乘 二:求和 三.斐波那契数列 四.上楼梯问题 ...

  • 递归函数

    将分类递归,上下级排序 【PHP】 【JS】

  • JavasScript重难点知识

    JS 中的递归 递归, 递归基础, 斐波那契数列, 使用递归方式深拷贝, 自定义事件添加这一次,彻底弄懂 Java...

网友评论

      本文标题:JS递归

      本文链接:https://www.haomeiwen.com/subject/ckvupctx.html