iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >Javascript中递归函数的案例与代码是怎样的
  • 946
分享到

Javascript中递归函数的案例与代码是怎样的

2024-04-02 19:04:59 946人浏览 薄情痞子
摘要

这篇文章给大家介绍javascript中递归函数的案例与代码是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 一.递归函数的理解1、生活中的递归“递归”在生活中的一个典

这篇文章给大家介绍javascript递归函数的案例与代码是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

 一.递归函数的理解

1、生活中的递归

Javascript中递归函数的案例与代码是怎样的

“递归”在生活中的一个典例就是“问路”。如图小哥哥进入电影院后找不到自己的座位,问身边的小姐姐“这是第几排”,小姐姐也不清楚便依次向前询问,问至第一排的观众后依次向后反馈结果,“我是第一排”,“我是第二排”,···,最终确定自己座位所在排数。

在这个过程中充分反应了“传递”(询问)和“回归”(反馈)的思想,故将这种现象称为“递归”。

2、编程中的递归

计算机有两个特点:“很笨”又“很快”。所以将“复杂问题”转化为“多步骤的简单问题”后,计算机才能高效执行。

而递归是编程算法的一种,通过调用自身,将一些复杂的问题简单化,便于得出解决方案。

下面通过简单的案例了解编程中的递归

案例:计算1+2+3+4+5+6的和。

function fn(n){     if(n === 1){         return 1;     }     return n + fn(n - 1); } fn(6);

计算过程:f(6) = 6 + f(5)

f(6) = 6 + 5 + f(4)

f(6) = 6 + 5 + 4 + f(3)

f(6) = 6 + 5  + 4 + 3 + f(2)

f(6) = 6 + 5 + 4 + 3 + 2 + f(1)

f(6) = 6 + 5 + 4 + 3 + 2 + 1

由上可知递归函数的本质:

  • 调用自身

递归函数的实现有两个要素:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 终止条件

  3. 逐步靠近终止条件

案例中的终止条件是:当 n === 1 时,fn(1) === 1。若没有终止条件,函数会继续计算f(0) 、f(-1) 、f(-2) ···  从而进入死循环,无法得出结果。

通过计算过程可以看出,函数依次计算f(6)、f(5)、f(4)、f(3)、 f(2)、f(1),很好的满足了第二个要素 逐步靠近终止条件。

二.递归函数的使用

通过以上讲解,想必已经了解递归函数的原理,

那么递归函数是如何写出来的呢?

如何利用递归函数解决实际问题呢?

实例探索递归函数的书写“套路”

例题:计算n的阶乘。

步骤 1:找到终止条件,写给 if

数学知识 :n! = n * (n - 1) * (n - 2) * (n -3) * ··· * 3 * 2 * 1

显然 终止条件 是 n === 1; 时, return 1;故可以完成函数的 前半部分:

function fn(n){     if(n === 1){         return 1;     }     // 未完待续 }

步骤2:找到函数的等价关系式,写给 return

数学知识 :n! = n * (n - 1)!

通过数学知识 n! = n * (n - 1)! 和递归函数的本质(调用自身),

可以得出函数的等价关系式为 f(n) = n * f(n - 1);

从而可以完成函数的后半部分:

function fn(n){     if(n === 1){         return 1;     }     return n * fn(n - 1); }

至此简单的递归函数便写出来了,递归函数最大的特点便是代码简洁(简洁到让人心虚)。

总结,递归函数的书写“套路”

1.找到终止条件,写给 if

2.找到函数的等价关系式,写给 return

三.递归函数的问题

想必你会说,上面的两个例题用 循环 就能轻松写出来,为何还需要使用递归呢?

其实能用 递归 解决的问题,用 循环 也能解决!而且 递归 比 循环  的运算速度要慢,因为 递归 需要逐层调用函数,占据系统内存,当 递归 层级较深时,对性能消耗较大,往往不推荐使用。

问:那递归存在的意义是什么?

递归 是为了将复杂问题简单化,提供解题思路,进而得到 “循环算法”

对于简单问题,一眼便能看出“循环算法”,但对于抽象问题,通常可以先采取 递归 思想,如:

例题:某人需要走上10级台阶,有两种走法,走法A:一步1个台阶;走法B:一步2个台阶。两种走法可以任意交替使用,问走上10级台阶共有多少种方法?

Javascript中递归函数的案例与代码是怎样的

这个问题很难直接看出循环的解题思路,我们不妨从 递归 的角度尝试解决:

当走上第10级台阶只差最后一步时,存在有两种可能:

第1种:从 第8级 —> 第10级(一步2个台阶)

第2种:从 第9级 —> 第10级(一步1个台阶)

假设:从 第0级 —> 第8级,有 x 种走法;

1,1,1,1,1,1,2,2

1,1,1,1,1,2,1,2

1,2,1,1,1,2,2

1,2,1,2,2,2

·······

// 穷举不尽,共 x 种,每种走法的最后一步都是 2(个台阶)

假设:从 第0级 —> 第9级,有 y 种走法;

1,1,1,1,1,1,1,2,1

1,1,2,1,1,2,1,1

1,2,1,2,2,1,1

1,2,2,2,2,1

·······

// 穷举不尽,共 y 种,每种走法的最后一步都是 1(个台阶)

那么,从 第0级 —> 第10级,共有 x + y 种走法。

故,10级台阶走法 = 9级台阶走法 + 8级台阶走法,即 f(10) = f(9) + f(8);

所以我们需要的函数关系式是 f(n) = f(n - 1) + f(n - 2);

接下来找 终止条件:

1级台阶时,走法只有1种(1步1台阶),是 n === 1; 时, return 1;

2级台阶时,走法只有2种(2次1步1台阶 或 1步2台阶),是 n === 2; 时, return 2;

由此可以写出递归函数

function fn(n){     if(n === 1 || n === 2){         return n;     }     return fun(n - 1) + fun(n - 2); }

下图展示了函数的执行过程

Javascript中递归函数的案例与代码是怎样的

可见,在函数执行过程中重复调用了多次相同的函数(相同背景色),从而极大消耗了系统的性能。经过测试这个 递归函数 最多可计算至  f(45);左右的结果(测试需谨慎),这便是 递归函数 存在的主要问题。

那么如何优化这个问题呢?

即,将 递归算法改为循环算法。

通过前面的推导我们知道 f(n) = f(n - 1) + f(n - 2);

1级台阶 ==> 走法:1

2级台阶 ==> 走法:2

3级台阶 ==> 走法:1 + 2 = 3

4级台阶 ==> 走法:2 + 3  = 5

5级台阶 ==> 走法:3 + 5 = 8

6级台阶 ==> 走法:5 + 8 = 13

7级台阶 ==> 走法:8 + 13 =  21······

即,只要知道前两项(1级台阶和2级台阶)的结果,就可以自底向上依次推算出后面所有项的结果。于是便可以写出 循环函数

function fn(n){     if(n === 1 || n === 2){         return n;     }     var left = 1; // 左边的数据     var right = 2; // 右边的数据     var sum = 0;     for(var i = 3 ; i <= n ; i++){ // 循环从第3项开始         sum = left + right; // 计算前一次左右数据的和         left = right; // 把前一次的right赋值给下一次的left         right = sum; // 把前一次的和赋值给下一次的right     }     return sum; }

以上便是通过递归思想将抽象问题逐步简单化,从而得出循环算法的过程。

循环算法 解决了 递归 消耗系统性能的问题,可以计算任意数值。

(当数值太大超出JavaScript数值范围时,返回 Infinity)

四.总结

1、递归结构简单,易理解,常用于将抽象问题简单化。

2、递归要有终止条件,否则会变成死递归;

3、递归算法运行效率低、性能消耗大,递归深度较大时慎用(等不到结果);

4、能用递归解决的问题大多都能用循环解决。

关于Javascript中递归函数的案例与代码是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Javascript中递归函数的案例与代码是怎样的

本文链接: https://www.lsjlt.com/news/82580.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Javascript中递归函数的案例与代码是怎样的
    这篇文章给大家介绍Javascript中递归函数的案例与代码是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 一.递归函数的理解1、生活中的递归“递归”在生活中的一个典...
    99+
    2024-04-02
  • 如何理解JavaScript中的递归函数
    今天就跟大家聊聊有关如何理解JavaScript中的递归函数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是递归函数在编程世界里面,递归就是一个...
    99+
    2024-04-02
  • Python3中递归函数的示例分析
    这篇文章将为大家详细讲解有关Python3中递归函数的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python3之递归函数简单示例概述递归函数即直接或间接调用自身的函数,且递归过程...
    99+
    2023-06-02
  • Javascript中怎么实现函数声明与递归调用
    Javascript中怎么实现函数声明与递归调用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、函数声明变量式声明先创建一个匿名函数,然后把...
    99+
    2024-04-02
  • python中的递归函数是什么
    这篇文章将为大家详细讲解有关python中的递归函数是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对代...
    99+
    2023-06-14
  • python中递归函数与匿名函数的特性
    这篇文章主要介绍“python中递归函数与匿名函数的特性”,在日常操作中,相信很多人在python中递归函数与匿名函数的特性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python中递归函数与匿名函数的特性...
    99+
    2023-06-02
  • Vue实现递归组件的思路与示例代码
    目录前言一、递归组件是什么?二、Vue实现递归的核心思路三、代码示例1.父级2.子级3、实现效果补充:递归组件的应用场景总结前言 在我们开发过程中,为了提高开发效率,降低开发难度,我...
    99+
    2024-04-02
  • C++ 函数的递归实现:尾递归在实际应用中的示例?
    c++++中的尾递归优化:尾递归是一种函数在调用自身后立即返回的优化技术。通过指定noinline关键字,可在c++中实现尾递归,提高性能。实战案例:使用尾递归计算阶乘,该阶乘定义为从1...
    99+
    2024-04-22
    c++ 递归
  • JavaScript中递归函数解“汉诺塔”算法的示例分析
    小编给大家分享一下JavaScript中递归函数解“汉诺塔”算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!“汉诺塔...
    99+
    2024-04-02
  • JavaScript中关于递归与回溯的实例详解
    目录何为递归构成递归条件关于回溯实际业务组合问题何为递归 递归作为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复...
    99+
    2024-04-02
  • C++ 函数的递归实现:递归在语言分析中的应用示例?
    递归是一种函数在自身内部调用自身的编程范式。在 c++++ 中,可使用 operator() 运算符实现递归。递归在语言分析中可用作分析嵌套结构的工具,例如识别括号序列的合法性:如果序列...
    99+
    2024-04-22
    函数 c++ 递归
  • C语言中函数递归的示例分析
    这篇文章主要介绍C语言中函数递归的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是递归?递归(recursion):程序调用自身的一种编程技巧。如何理解函数递归:从调用自身层面:函数递归就是函数自己调用自...
    99+
    2023-06-29
  • Python的递归函数与匿名函数调用方法是什么
    本篇内容主要讲解“Python的递归函数与匿名函数调用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python的递归函数与匿名函数调用方法是什么”吧!一. 递归函数  a) 引言:在...
    99+
    2023-06-01
  • JavaScript 闭包与高阶函数是怎样的
    JavaScript 闭包与高阶函数是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。「JavaScript 中,函数是一等公民」,在各种...
    99+
    2024-04-02
  • C++ 函数的递归实现:递归在计算机图形学中的应用示例?
    递归在计算机图形学中有广泛应用,包括生成分形(使用递归函数生成自相似几何形状):例如,科赫曲线分形是通过一个递归函数绘制的,该函数每次调用时生成原始形状的较小版本。递归还用于遍历场景图,...
    99+
    2024-04-23
    函数 递归 c++
  • 详解Python中递归函数的原理与使用
    目录什么是递归函数递归函数的条件定义一个简单的递归函数代码解析内存栈区堆区死递归尾递归实例什么是递归函数 如果一个函数,可以自己调用自己,那么这个函数就是一个递归函数。 递归,递就是...
    99+
    2024-04-02
  • javascript中闭包closure的代码案例
    这篇文章主要讲解了“javascript中闭包closure的代码案例”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript中闭包closure的代码案例”吧!简介闭包closu...
    99+
    2023-06-06
  • JavaScript正则表达式校验与递归函数实际应用的示例分析
    小编给大家分享一下JavaScript正则表达式校验与递归函数实际应用的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • python的open函数使用案例代码
    目录1.open()1.1 参数11.2 参数21.3 参数32.with open() as3.open函数常用的方法3.1 读3.2 写3.3 获取文件读写类型3.4 指针移动3...
    99+
    2023-02-10
    python的open函数使用 python open函数
  • js中递归函数的执行过程是什么
    在JavaScript中,递归函数的执行过程如下:1. 当调用递归函数时,程序会首先执行函数体内的代码。2. 在函数体内,如果遇到递...
    99+
    2023-09-15
    js
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作