递归的总结和案例

news2025/2/22 6:36:32

①使用递归的方法获取1-100的总和

function sum(num){
    if(num === 1){
        return num = 1
    }else {
        return num+sum(num-1)
    }
}
let num = 100

let numSum = sum(num)

console.log(numSum,'numSum')

②数组求和

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

执行顺序

  • 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
        }

执行顺序:

④斐波纳契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列

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

递归的总结:

问:

为什么递归不需要用新的字段存储每次的结果呢?

sum(5) = 5 + sum(4)
= 5 + (4 + sum(3))
= 5 + (4 + (3 + sum(2)))
= 5 + (4 + (3 + (2 + sum(1))))
= 5 + (4 + (3 + (2 + 1)))
= 5 + (4 + (3 + 3))
= 5 + (4 + 6)
= 5 + 10
= 15
为什么不设置一个新字段来存储每次递归的值,然后最后在想加得出最后的结果?

为什么递归是这样的形式,假设n=1的时候不是直接返回1吗?为什么不定义一个字段存储sum循环过程中的每个值?

重点回答:

递归函数的特性使其不需要显式地定义一个新的字段来存储每次递归的结果。

在递归过程中,每次递归调用都会在堆栈中创建一个新的函数执行上下文,并保存该次递归的局部变量和参数。当递归终止条件满足时,递归函数会开始回溯,将每次递归的返回值传递给上一层调用,直到达到最初调用的起始点。

因此,在递归过程中,通过函数的堆栈和返回值来自动保存和传递每次递归的结果。每次递归的返回值会被用于进行后续递归调用的操作,直到达到终止条件并返回最终的累加和。

递归的优势在于它能够以一种简洁的方式表达问题的解决方法,而不需要额外的变量或数据结构来存储中间结果。这种方式通常更易于理解和实现,并且能够更直观地反映问题的本质。然而,递归也可能导致堆栈溢出或者性能下降,特别是在处理大量数据或者嵌套层级较深的情况下,需要谨慎使用并进行优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1043089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 B: 双子数

[蓝桥杯 2023 国 B] 双子数 试题 B: 双子数 【问题描述】 若一个正整数 x x x 可以被表示为 p 2 q 2 p^2 \times q^2 p2q2&#xff0c;其中 p p p、 q q q 为质数且 p ≠ q p \neq q pq&#xff0c;则 x x x 是 一个 “双子数”。请计算区间 [ 2333 , 233333333333…

数据结构-在堆中插入或删除新元素

目录 在堆中插入新元素 在堆中删除元素 知识回顾 在堆中插入新元素 首先插入13&#xff08;这里我们依据的是小根堆原则&#xff0c;遇到大根堆也是类似的&#xff09; &#xff08;1&#xff09;将新元素放到队列的队尾&#xff0c;在完全二叉树里面显示的是堆底 如下图…

ElasticSearch - 基础概念,以及和 mysql 的对比

目录 一、ElasticSearch 基础概念 1.1、文档&#xff08;document&#xff09; 1.2、索引&#xff08;index&#xff09; 1.3、映射&#xff08;mapping&#xff09; 二、对比 mysql 2.1、概念对比 2.2、适用场景对比 2.2.1、那是不是说&#xff0c;有了 es 之后&#…

Win10下获取海康威视网络串流(顺便求教Ubuntu服务器做法)

如果有摄像头专供充电器最好&#xff0c;那样可以用交换机&#xff0c;而且可以用海康威视官方的&#xff08;大概&#xff09;400密码重置助手获取摄像头IP地址&#xff0c;并做账号初始化等工作 我是一开始还有充电器的时候做了账号初始化&#xff0c;但是现在找不着充电器了…

java - 数组工具类Arrays

目录 前言 一、Arrays是什么? 二、常用方法 1.toString()&#xff1a;将数组转换为字符串形式。 2. binarySearch()&#xff1a;在已排序的数组中查找指定元素的索引。 3.fill()&#xff1a;将数组的所有元素都设置为指定值。 4. copyOf()&#xff1a;将一个数组的部分或…

【实训项目】益农小程序

1.项目背景 受到疫情影响&#xff0c;农作物物流运输受阻、产品滞销&#xff0c;给农民的“菜园子”和市民的“菜篮子”带来不少影响&#xff0c;一边是农民种植的蔬菜、草莓等地产农副食品滞销&#xff0c;一边是城区居民买不到新鲜、实惠的农副产品。 有很多地区&#xff0…

【解决方案】‘create’ is not a member of ‘cv::aruco::DetectorParameters’

‘create’ is not a member of ‘cv::aruco::DetectorParameters’ 在构建AruCo标定板标定位姿代码的过程中&#xff0c;发现代码中认为create并不是aruco::DetectorParameters的成员函数&#xff0c;这是因为在4.7.0及以上的OpenCV版本中&#xff0c;对ArUco的代码做调整&…

【KingFusion】如何在3D场景实现流水效果

哈喽&#xff0c;大家好,我是雷工&#xff01; 在项目过程中&#xff0c;经常会涉及到实现管道水流动效果&#xff0c;此篇记录在KingFusion中的3D场景实现水流效果。 以下为简单流水效果的样例&#xff0c; 一、效果展示 当点击水泵&#xff0c;水泵启动&#xff0c;显示流水…

Linux开篇指南针环境安装(第一课)

Linux开篇指南针(第一课) 1 LINUX 系统介绍 Linux是一种自由和开放源代码的类UNIX操作系统&#xff0c;它最初由芬兰的林纳斯托瓦兹在1991年创建。Linux是一种多用户、多任务操作系统&#xff0c;可以在各种硬件平台上运行&#xff0c;包括桌面、移动设备、服务器和超级计算机…

JavaScript项目1_猜数字(前导)

● 本节&#xff0c;我们将做这样的一个小游戏&#xff0c;意思就是随机生成一个数字&#xff0c;然后你去猜测&#xff0c;本文不涉及HTML和CSS的代码&#xff0c;如果有需要的话可以私信我&#xff01; document.querySelector() document.querySelector() 是 JavaScript 中…

vue2.x 迭代更新项目去掉缓存处理

找到build文件下的webpack.prod.conf.js文件 定义一个常量version const Version new Date().getTime(); 然后在.js和.css前面加上.${Version}就可以了&#xff08;注意得把原本的换成&#xff09;

Dink进阶之路

1、环境变量 cat /etc/profile #flink需要 export HADOOP_CLASSPATHhadoop classpath export HADOOP_CONF_DIR/etc/hadoop/conf2、Flink配置 2.1、flink-conf.yaml jobmanager.rpc.address: node-146 jobmanager.rpc.port: 6123 # 设置jobmanager总内存 jobmanager.memory.…

MongoDB(二)基础操作 创建、删除,查询等

mongodb有一个特点&#xff0c;如果某个库&#xff0c;库下面没数据&#xff08;mongodb成集合&#xff09;&#xff0c;该库等于不存在的 mongodb只要创建一个库&#xff0c;在库下写入数据&#xff0c;该库才会生成 mongoshe [-hhost -pxxx] 创建数据库 use 数据库名 # 如果…

阿里巴巴OceanBase介绍

前言 官网地址&#xff1a;https://www.oceanbase.com/ OceanBase是由蚂蚁集团完全自主研发的国产原生分布式数据库&#xff0c;始创于2010年。是全球唯一在 TPC-C 和 TPC-H 测试上都刷新了世界纪录的国产原生分布式数据库。 2010年&#xff0c;创始人阳振坤加入阿里巴巴&…

华为云云耀云服务器L实例评测|华为云云耀云服务器L实例CentOS的存储和备份策略

1 华为云云耀云服务器L实例介绍 华为云云耀云服务器L实例是华为云计算服务中的一种虚拟云服务器&#xff0c;它提供了强大的计算资源&#xff0c;可以在云端运行各种应用程序和服务。 华为云服务器提供了多种实例类型&#xff0c;包括通用型、计算优化型、内存优化型等&#…

数据中心不能“偏科”,AIGC时代算力、存力需协调发展

黄金比例是数学上一种堪称“完美”的比例关系&#xff0c;最早由欧几里得在《几何原本》中进行了系统论述。之后&#xff0c;黄金比例的理念被广泛应用到数学、物理、建筑、农业等多个领域&#xff0c;代表着最合理、最协调的一种情况或者状态。 在数据中心领域&#xff0c;相…

模板的注意事项

目录 swap函数&#xff1a; 模板不支持分离编译 声明和定义分离的好处 swap函数&#xff1a; #include<iostream> using namespace std; template <class T> void swap(T&left, T&right) {T temp right;right left;left temp; } int main() {int a …

Vue比较两个数字大小

实现一个比较两个数字大小的页面&#xff0c;练习Vue实例的创建、数据绑定和事件监听方法&#xff1b; <div id"aa"> <ul> <li> <span>第一个数&#xff1a;</span><input v-model.number"first"/> </li> <…

详解Java执行groovy脚本的两种方式

详解Java执行groovy脚本的两种方式 文章目录 详解Java执行groovy脚本的两种方式介绍记录Java执行groovy脚本的两种invokeFunction:invokeMethod:以下为案例&#xff1a;引入依赖定义脚本内容并执行运行结果&#xff1a;例如把脚本内容定义为这样&#xff1a;执行结果就是这样了…

微盟十年:踩准节奏,持续增长

今年以来&#xff0c;中国SaaS行业经历了资本由炽热到寒冬&#xff0c;行业融资笔数和金额均呈现断崖式下跌&#xff0c;截至7月共发生投融资50笔&#xff0c;与去年相比直接腰斩&#xff1b;投融资金额43.52亿元&#xff0c;与2021年同期的258.2亿元、2022年同期的142.37亿元形…