gpt4 book ai didi

recursion - 在递归期间为变量赋值

转载 作者:行者123 更新时间:2023-12-03 02:54:18 25 4
gpt4 key购买 nike

所以我有一个列表( [123,487693821,1234,[111,222,[10,20],[11,45],34,21],333,[67,67],546] )和一个基本的递归函数,它以格式化的方式打印列表,以便在列表中有列表时缩进并显示列表的级别,如下所示:

0 123
0 487693821
0 1234
1 111
1 222
2 10
2 20
2 11
2 45
1 34
1 21
0 333
1 67
1 67
0 546

执行此操作的代码是:

listPrinter(list,[lev=0,ind=''])
{
for(var e in list)
{
if(e is List) listPrinter(e,lev+1,ind+'\t');
else print('$lev $ind$e');
}
}

我的问题是,当我更改 lev+1 时,递归期间会发生什么?类似于 lev++ , 或 ++lev .我有每个场景的输出,我将在下面发布,但我不知道为什么我会得到我所做的输出。我不知道如何跟踪递归调用中发生的事情。请注意,我唯一更改的是 lev ,所以在下面的输出中缩进仍然是正确的。

'lev + 1' 更改为 lev++ 时的输出.如您所见,直到 2 上的第二个列表,级别才发生变化。 level (引用第一个输出),然后在最后做一些古怪的东西。
0 123
0 487693821
0 1234
0 111
0 222
0 10
0 20
1 11
1 45
2 34
2 21
1 333
1 67
1 67
2 546
lev + 1 时输出改为 ++lev .此方法在到达 2 中的第二个列表之前是正确的。级别(再次引用我发布的第一个输出),然后它开始做一些我无法理解的疯狂事情。
0 123
0 487693821
0 1234
1 111
1 222
2 10
2 20
3 11
3 45
3 34
3 21
1 333
2 67
2 67
2 546

我知道这很复杂,但实际上它只是归结为在递归、postcrements 和 precrements 中分配变量时会发生什么。它所用的语言是 dart,但如果这样更容易的话,我可能可以用 python 或 java 来编写它。谢谢。

澄清:我了解 lev + 1不同于 ++levlev++因为它实际上并没有为 lev 赋值。我想知道的是当我分配 lev 时递归过程中发生了什么到一个新的值,以及为什么它对于 postcrement 和 precrement 不同。

最佳答案

在您的函数中定义了一个整数,称为 lev
默认情况下(在您的第一个函数调用中)lev 的值是 0
现在在函数的上下文中你调用一个函数(实际上是同一个函数,但这并不重要)。

当你这样称呼它时

func(lev+1) 

该函数将使用参数值 lev+1 调用在函数返回 lev 的值之后在调用函数的上下文中保持不变。

当你这样称呼它时
func(lev++) 

该函数将使用参数值 lev 调用在函数返回 lev 的值之后是 lev+1在调用函数的上下文中。 ++ -部分称为 后自增运算符 因为它会增加变量 的值之后 已调用电话

当你这样称呼它时
func(++lev) 

该函数将使用参数值 lev+1 调用在函数返回 lev 的值之后是 lev+1在调用函数的上下文中。 ++ -部分称为 预增运算符 因为它会增加变量 的值之前 已调用电话

现在,您在递归情况下使用它的事实可能会使事情变得有些困惑。

你要明白每个函数调用都会定义 lev在该上下文中使用。由于你使用递归,所以会有几个变量 lev彼此相邻,每个都在自己的功能上下文中

关于recursion - 在递归期间为变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16389171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com