所以我有一个列表([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
级别的第二个列表(参考第一个输出)之前,级别甚至没有改变,然后在那里做了一些古怪的东西。
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
我知道这很复杂,但实际上它只是归结为在递归,后增量和预增量中分配变量时会发生什么。它编写的语言是dart,但如果更容易,我可以用python或java编写它。感谢。
澄清:我了解lev + 1
与++lev
和lev++
的不同之处在于它实际上并未为lev分配值。我想知道的是,当我将lev
分配给一个新值时,在递归过程中发生了什么,以及为什么它对于一个postcrement和precrement是不同的。
答案 0 :(得分:3)
在你的函数中有一个定义为lev
默认情况下(在您的第一次函数调用中)lev
的值为0
现在在函数的上下文中调用一个函数(实际上是相同的函数,但这并不重要)。
当你这样称呼它时
func(lev+1)
将使用参数值lev+1
调用该函数,并在函数返回后,lev
的值在调用函数的上下文中保持不变。
当你这样称呼它时
func(lev++)
将使用参数值lev
调用该函数,并在函数返回后,lev
的值在调用函数的上下文中为lev+1
。 ++
- 部分称为后增量运算符,因为它会在调用之后增加变量的值
当你这样称呼它时
func(++lev)
将使用参数值lev+1
调用该函数,并在函数返回后,lev
的值在调用函数的上下文中为lev+1
。 ++
- 部分称为预增量运算符,因为它会在调用之前增加变量的值
现在你在递归情况下使用它的事实可能会使事情有点混乱。
您必须了解每个函数调用将定义要在该上下文中使用的lev
。由于你使用递归,因此会有几个变量lev
彼此相邻,每个变量都在它们自己的函数上下文中
答案 1 :(得分:0)
lev ++或++ lev意味着lev的价值将被实现。它与
相同lev = lev + 1;
lev + 1只返回lev + 1的值,保持变量lev不变。
lev ++和++ lev之间的区别在于前者在赋值或使用变量后会提高它的值,而后者在使用之前会这样做。
答案 2 :(得分:0)
之间的区别:
someFn(lev + 1)
和someFn(++lev)
或someFn(lev++)
是后两者实际上在您所在的循环中间更改lev
的值。第一个不会修改该值。