前端涨薪功法:一文掌握你所需的递归知识 您所在的位置:网站首页 数列的子序列 前端涨薪功法:一文掌握你所需的递归知识

前端涨薪功法:一文掌握你所需的递归知识

2023-05-18 02:14| 来源: 网络整理| 查看: 265

故事中的递归技巧

image.png 开头先分享一则小故事:

一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到:“一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到:‘一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到……’”

这个故事可以一直讲下去,也就是一则无限递归的小故事了,故事本身一直在重复

JavaScript中的递归:直接与间接递归

递归是一种编程技巧,函数调用自身来解决问题。

其本质是在计算机科学中来说,递归是一种解决计算问题的方法,其中的解决方案取决于同一问题的较小实例的解决方案

较小的实例的解决方案,也就是解决问题的最简实例。

在JavaScript中,递归可以用来解决各种问题,如遍历和搜索树或图,生成排列或组合,以及解决数学问题。

递归主要有两种类型:直接递归和间接递归。

在直接递归中,函数直接调用自身。在间接递归中,函数调用另一个函数,后者又调用原始函数,形成一个循环。

以下是JavaScript中阶乘的直接递归的示例

阶乘的数学定义

image.png

最简示例 2 * 1

结束条件 n === 1

function factorial(n) { if (n === 1) { return 1; } else { return n * factorial(n - 1); } } console.log(factorial(5)); // 输出:120

如下图所示向下传递数据就是一直到终止条件factorial(1),向上递归数据第一步就是变为最简的解决方案即 1 * 2

image.png

image.png

以下是JavaScript中间接递归的示例:

function isEven(n) { if (n === 0) { return true; } else { return isOdd(n - 1); } } function isOdd(n) { if (n === 0) { return false; } else { return isEven(n - 1); } } console.log(isEven(4)); // 输出:true console.log(isOdd(4)); // 输出:false

在这个例子中,isEven和isOdd函数间接地调用彼此来判断给定数字是偶数还是奇数。isEven函数检查输入数字n是否等于0,如果是,则返回true。否则,它调用isOdd函数并传入n - 1。类似地,isOdd函数检查n是否等于0,如果是,则返回false。否则,它调用isEven函数并传入n - 1。

从上可以得出,写好一个递归方法,也就是关注两点

基本解决方案实例递归结束条件 优化递归的方案

网上传的尾递归,拿上面的阶乘递归来说,尾递归版本是:

function factorial(n, acc = 1) { if (n }) { if (n in memo) { return memo[n]; } if (n === 0) { return 1; } memo[n] = n * factorial(n - 1); return memo[n]; }

碰上大数据量的数据时,可以通过递归推出for循环版本的算法:

function factorial(n) { let result = 1; for (let i = 1; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有