Javascript 如何使用递归更新局部作用域变量

Javascript 如何使用递归更新局部作用域变量,javascript,recursion,Javascript,Recursion,如果这是一个太多的一般性问题,请原谅,但是当我需要开发递归算法,在每次递归调用中更新一些值时,我似乎经常遇到这个问题。请以下面的例子为例: 我想做一个递归算法,它累加给定配置文件的年龄,以及该配置文件中存在的所有孩子和孩子的孩子等 配置文件结构: const配置文件={ 姓名:'彼得', 年龄:56岁, 孩子们:[{ 名字:“吉尔”, 年龄:23,, 孩子们:[{ 姓名:'杰特', 年龄:1 }, { 姓名:'比尔', 年龄:2 }] }] } 如果我在函数范围之外声明一个变量并更新它是否工作

如果这是一个太多的一般性问题,请原谅,但是当我需要开发递归算法,在每次递归调用中更新一些值时,我似乎经常遇到这个问题。请以下面的例子为例:

我想做一个递归算法,它累加给定配置文件的年龄,以及该配置文件中存在的所有孩子和孩子的孩子等

配置文件结构:

const配置文件={
姓名:'彼得',
年龄:56岁,
孩子们:[{
名字:“吉尔”,
年龄:23,,
孩子们:[{
姓名:'杰特',
年龄:1
}, {
姓名:'比尔',
年龄:2
}]
}]
}
如果我在函数范围之外声明一个变量并更新它是否工作。像这样:

让totalage=0
函数getAge(配置文件){
totalage=profile.age+totalage
如果(!profile.kids)返回
for(const kid of profile.kids){
基德
}
}
getAge(个人资料)
console.log(总计)
根据此逻辑,为了使函数更具可重用性,我想创建一个shell函数,用于设置年龄变量,这样在我想要获取所有年龄时,它就不必全局声明,但此解决方案返回0,原始年龄值:

函数获取(配置文件){
让年龄=0
递归(配置文件、年龄)
回归年龄
}
函数递归(配置文件、年龄){
年龄=个人资料。年龄+年龄
如果(!profile.kids)返回
for(const kid of profile.kids){
递归(儿童、年龄)
}
}
控制台日志(getAges(profile))

你知道怎么回事吗?

你可以通过递归函数返回这个人的年龄加上他们所有的孩子;然后,可以在下一级进行汇总(以此类推),以返回配置文件的总年龄:

const配置文件={
姓名:'彼得',
年龄:56岁,
孩子们:[{
名字:“吉尔”,
年龄:23,,
孩子们:[{
姓名:'杰特',
年龄:1
}, {
姓名:'比尔',
年龄:2
}]
}]
}
函数getAge(配置文件){
让totalage=profile.age;
if(profile.kids){
for(const kid of profile.kids){
总年龄+=总年龄(儿童);
}
}
返回总数;
}

console.log(getAge(profile))您可以通过递归函数返回此人的年龄及其所有子女;然后,可以在下一级进行汇总(以此类推),以返回配置文件的总年龄:

const配置文件={
姓名:'彼得',
年龄:56岁,
孩子们:[{
名字:“吉尔”,
年龄:23,,
孩子们:[{
姓名:'杰特',
年龄:1
}, {
姓名:'比尔',
年龄:2
}]
}]
}
函数getAge(配置文件){
让totalage=profile.age;
if(profile.kids){
for(const kid of profile.kids){
总年龄+=总年龄(儿童);
}
}
返回总数;
}

console.log(getAge(profile))通用编程语言有局部和全局作用域全局是一个作用域,适用于每个对象,但如果是局部的,它只能在代码中的块内访问,您正在生成两个函数第一个是getAges,第二个是Recurse age age age是局部变量,只能在getAges内访问而不能在Recurse中访问这就是为什么输出为0。 好的,现在转向解决方案一,您可以从递归返回最终值,并将其存储在变量中,然后从getAges返回该值。 第二个是使递归成为aynonums函数,使其成为aynonums函数,由于js词汇环境,您可以直接进入递归。
我希望这将对您有所帮助

通用编程语言具有局部和全局作用域全局是一个作用域,适用于所有应用程序,但如果是局部的,它只能在代码中的块内访问,您正在生成两个函数第一个是getAges,第二个是Recurse age是局部变量,只能在getAges内访问,而不是在递归中,这就是为什么输出为0。 好的,现在转向解决方案一,您可以从递归返回最终值,并将其存储在变量中,然后从getAges返回该值。 第二个是使递归成为aynonums函数,使其成为aynonums函数,由于js词汇环境,您可以直接进入递归。
我希望这将对您有所帮助

首先,我想修复您的代码,使其正常工作

const profile={name:'peter',age:56,kids:[{name:'jill',age:23,kids:[{name:'jeter',age:1},{name:'bill',age:2}]};
函数获取(配置文件){
返回递归(配置文件)
}
函数递归(配置文件,年龄=0){
年龄+=profile.age;
if(profile.kids){
for(const kid of profile.kids){
年龄+=递归(儿童)
}
}
回归年龄;
}

log(getAges(profile))
首先,我想修复您的代码以使其正常工作

const profile={name:'peter',age:56,kids:[{name:'jill',age:23,kids:[{name:'jeter',age:1},{name:'bill',age:2}]};
函数获取(配置文件){
返回递归(配置文件)
}
函数递归(配置文件,年龄=0){
年龄+=profile.age;
if(profile.kids){
for(const kid of profile.kids){
年龄+=递归(儿童)
}
}
回归年龄;
}

log(getAges(profile))
创建递归函数时,从基本情况开始,此时递归应该停止。(可能有多个基本情况。)

这是当这个人没有孩子的时候

function getAge(parent){
  // base case
  if (!parent.kids) return parent.age;

  // recursive call for each child
  return parent.kids.reduce((a, child) => a + getAge(child), parent.age);
}
我使用reduce来汇总一个整数数组,以处理多个孩子。 ()


默认情况下,不使用累加器
(让totalage=0)
在递归之间存储值。因为如果你的函数变异了一个外部变量,它就不是纯函数。当然,您可以有一个包装函数来存储累加器,该函数是纯函数。因此,归根结底,一切都取决于你希望自己的分析能力。

创建一个递归函数,从基本情况开始,递归应该停止。(可能有多个基本情况。)

这是当这个人没有孩子的时候

function getAge(parent){
  // base case
  if (!parent.kids) return parent.age;

  // recursive call for each child
  return parent.kids.reduce((a, child) => a + getAge(child), parent.age);
}
我使用reduce来汇总一个整数数组,以处理多个孩子。 ()

默认设置为“不”