首页 > 其他分享 >递归函数的全局变量使用技巧

递归函数的全局变量使用技巧

时间:2023-01-27 17:45:50浏览次数:38  
标签:arr 技巧 递归函数 item result path 全局变量 children

递归函数的全局变量使用技巧

我希望提取以下数组中每个path的值放入一个数组

let arr = [
    {
        path: 'a',
        b: 2,
        children: [
            {
                path: 'b',
                b: 3,
                children: [
                    {
                        path: 'c'
                    },
                    {
                        path: 'd'
                    },
                ]
            }
        ]
    },
    {
        path: 'e',
        b: 2,
    }
]

一、将全局变量直接定义在递归函数的参数中,将不需要在全局额外定义一个全局变量(而且还有副作用)

function fn(arr, result = []) {
    for (const item of arr) {
        result.push(item.path)
        if (item.children) {
            fn(item.children, result)
        }
    }
    return result   // ["a","b","c","d","e"]
}
console.log(fn(arr));

二、如果将这个变量直接定义为全局变量

let result = []
function fn(arr) {
    for (const item of arr) {
        result.push(item.path)
        if (item.children) {
            fn(item.children, result)
        }
    }
    return result   // ["a","b","c","d","e"]
}
console.log(fn(arr));
// 定义的这个全局变量已被修改
console.log(result);   // ["a","b","c","d","e"]
// 必须将全局变量置空
result = []

总结

  1. 为什么这个函数参数可以当做递归函数的全局变量使用,因为递归时,因为对着个参数的引用一直没有变,所以这个参数对函数来说就是全局变量了。
  2. 全局定义变量后还需要手动恢复,另外在全局造成污染。
  3. 从内存和运行速度的角度考虑这两个方法,全局定义变量运行速度肯定快但更占内存,属于用空间来换时间,而函数参数只有在运行到这个函数时才会开辟空间给形参,调用结束时释放空间。
  4. 综上所述,从可读性和封装性维护性考虑,请优先使用函数的参数当做变量使用。

标签:arr,技巧,递归函数,item,result,path,全局变量,children
From: https://www.cnblogs.com/wanglei1900/p/17069092.html

相关文章

  • 前端小技巧之 --- 【对象数组分类并排序】
    当前需求是:把下面的数组,按照index值分类,再按照字母顺序排序exportconstsingerList=[{id:0,index:'Z',name:'周杰伦'},{id:1,index:'X',......
  • 前端小技巧之 --- 【控制一段代码只执行一次】
    在一个循环列表【有图片】中,<img>标签上监听图片加载事件,如何控制事件中的代码只执行一次checkloaded为false或者没有值的时候执行,并在执行语句中把checkloaded设为true,......
  • 数论技巧笔记
    处理取模:\(x\mod\p=x-p\lfloor\frac{x}{p}\rfloor\)。处理\(-1\)的幂:\((-1)^a=1-2(a\mod\2)=1-2(a-2\lfloor\frac{a}{2}\rfloor)\),从而把\(a......
  • 逆向技巧——从混淆说明IDA Python脚本的使用
    之前工作的时候,遇到过病毒需要使用IDApython进行反混淆的问题,但是由于病毒的工作量较大、前置步骤多,没有很好的总结。闲下来了,有空了,根据网上的Demo做个实验记录一下。......
  • 小技巧,让VS2008打开VS2010的工程
    今天某童鞋想打开老师给的一个VS2010的工程,而其电脑上却没有装VS2010,只装了VS2008,我让其将工程发给我,我的机子也只装了VS2008,打开工程时提示如下:选择的文件是解决方案文......
  • 位运算的小技巧
    1//1.使用左移运算符<<迅速得出2的次方21<<2//4,即2的2次方31<<10//1024,即2的10次方4//但是要注意使用场景5x=2e9;//2000000000......
  • Web前端画布元素的技巧速成
    画布(canvas)是HTML5中新增加的一个非常重要的元素,使用它的API,我们可以通过绘制的方式实现图形、线条和文字的显示。1.   目标使用画布元素,快速绘制一个中小学教学使用的工......
  • macOS 相关操作小技巧合集
    macOS相关操作小技巧合集2019-09-1717:57:59 本文来源:高老四博客 分类:macOSTell 阅读(451) 评论(0)作为MBP(MacBookPro)的新用户,最近老四也更新到了最新系统「Cata......
  • 常见重构技巧 - 去除多余的if else
    最为常见的是代码中使用很多的if/else,或者switch/case;如何重构呢?方法特别多​​出现if/else和switch/case的场景​​​重构思路​​​方式一-工厂类​​​​方式二-枚举......
  • C语言:递归函数
      #include<stdio.h>floatfh(intn){if(n==1)return1;elsereturn1/(n-1+1/fh(n-1));}main(){floataa=0;inta,b;for(a=1;fh(a......