文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JavaScript中有哪些递归经典案例题

2023-06-20 13:52

关注

这篇文章主要为大家展示了“JavaScript中有哪些递归经典案例题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript中有哪些递归经典案例题”这篇文章吧。

什么是递归,它是如何工作的?

我们先来看一下递归(recursion)的定义:

递归是一种解决问题的有效方法,在递归过程中,函数将自身作为子例程调用。

简单说程序调用自身的编程技巧叫递归。递归的思想是把一个大型复杂问题层层转化为一个与原问题规模更小的问题,问题被拆解成子问题后,递归调用继续进行,直到子问题无需进一步递归就可以解决的地步为止。

使用递归需要避免出现死循环,为了确保递归正确工作,递归程序应该包含2个属性:

  1. 基本情况(bottom cases),基本情况用于保证程序调用及时返回,不在继续递归,保证了程序可终止。

  2. 递推关系(recurrentce relation),可将所有其他情况拆分到基本案例。

函数中自己调用自己就是递归,切记要有终止条件,不然进入死循环     

一、求和

(1)数字求和

function sum(n){      if(n===1){        return n=1      }      return n+sum(n-1)    }    console.log(sum(5));

 执行顺序

5+sum(n-1)
5+4+sum(n-1)
5+4+3+sum(n-1)
5+4+3+2sum(n-1)
5+4+3+2+1

(2)数组求和

function sum(arr) {        var len = arr.length        if (len == 0) {          return 0        } else if (len == 1) {          return arr[0]        } else {          return arr[0] + sum(arr.slice(1))        }      }      let arr = [ 1, 2, 3, 4, 5 ]        console.log(sum(arr))

执行顺序

1+sum(2,3,4,5)
1+2+sum(3,4,5)
1+2+3(4,5)
1+2+3+4+sum(5)
1+2+3+4+5
1+2+3+9
1+2+12
1+14
15

二、数据转树

let data = [{                id: "01",                pid: "",                "name": "老王"            },            {                id: "02",                pid: "01",                "name": "小张"            }        ]
  function fn(data, rootId = '') {            const children = []      //定义一个空数组            data.forEach(item => {                if (item.pid === rootId) {    //如果每一项的pid=rootId就添加到数组里                    children.push(item)                    item.children = fn(data, item.id)                }            });            return children        }

使用递归转树 要知道根的pid是什么值才能进行下一步操作,作为起点。

执行顺序

JavaScript中有哪些递归经典案例题

三、汉诺塔

规则 下面三个柱子分别设为 a 、b、 c、 目标把a中的所有盘子分别从大到小依次放到c柱子中,每次只能移动一个盘子

JavaScript中有哪些递归经典案例题

实现思路:

  1. 将n-1个盘子从a挪到b

  2. 将n盘子从a挪到c

  3. 将n-1个盘子从b挪到c

function fn(num, start, middle, end) {               if(num>0){                fn(num-1,start,end,middle)                console.log(start+'====>'+end);                 fn(num-1,middle,start,end)            }           }              fn(2,'a','b','c')

把  num作为盘子的数量  start 作为a盘子  middle作为b盘子   end作为c盘子  

例如 2个盘子的执行顺序

第一行 把2带进去 num>0  执行第一个函数fn(2-1,start,end,middle) 又去执行了fn(1-1,start,end,middle) 发现num不大于0不仅如此if条件,回过来看 fn(2-1,start,end,middle) ,输出 console.log(a===>b) 

第二行console.log(start+'====>'+end);   直接输出 a===>c

第三行 fn(2-1,middle,start,end)  执行 console.log(b===>c)  下次再去执行  fn(1-1,middle,start,end) 进入不了循环执行完毕

执行顺序有点抽象,实在不理解就按照最简单的思路去做 fn(num, start, middle, end) ,平常我们玩游戏怎么玩就去怎么做,初始图

fn(num-1,start,middle,end)  把 第二个的参数位置作为要移动的盘子 把第四个的参数位置作为移动目标    每次看图把这个公式带进去 

JavaScript中有哪些递归经典案例题

第一步   fn(num-1,start,end,middle)   例如两个盘子 肯定是先把a-1放到b上  

JavaScript中有哪些递归经典案例题

第二步 把盘子a放c上直接输出 console.log('a===>c')

JavaScript中有哪些递归经典案例题

第三步 把盘子b放c上  fn(num-1,middle,start,end,) 

JavaScript中有哪些递归经典案例题

四、斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、

function Fibonacci(n) {            return  n <= 1?1:Fibonacci(n - 1) + Fibonacci(n - 2)        }

除了前两个 每次都是前一个数和前两个数的和相加等于第三个数 

例如数字5举例  前一项是3  前两项是2    3+2=5   

以上是“JavaScript中有哪些递归经典案例题”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯