2

所以我有一个列表[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+1lev++, 或++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

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

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

4

3 回答 3

3

在您的函数中定义了一个整数,称为lev

默认情况下(在您的第一个函数调用中)的lev值为0

现在在函数的上下文中你调用一个函数(实际上是同一个函数,但这并不重要)。

当你这样称呼它时

func(lev+1) 

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

当你这样称呼它时

func(lev++) 

该函数将使用参数值调用,lev并且在函数返回值后,该值lev位于lev+1调用函数的上下文中。-part++称为后增量运算符,因为它在调用完成递增变量的值

当你这样称呼它时

func(++lev) 

该函数将使用参数值调用,lev+1并且在函数返回值后,该值lev位于lev+1调用函数的上下文中。-part++被称为预增量运算符,因为它在调用之前递增变量的值

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

您必须了解每个函数调用都将定义lev为在该上下文中使用。由于您使用递归,因此将有几个变量lev彼此相邻,每个变量都在自己的函数上下文中

于 2013-05-05T21:19:58.567 回答
0

lev++ 或 ++lev 表示 lev 的值将被实现。这是一样的

lev = lev + 1;

lev + 1 只返回 lev + 1 的值,而变量 lev 保持不变。

lev++ 和 ++lev 之间的区别在于,前者在分配或使用变量后提高它的值,而后者在使用之前提高它的值。

于 2013-05-05T21:14:17.540 回答
0

和...之间的不同:

someFn(lev + 1)或者是后两者实际上正在改变你someFn(++lev)所在循环中间的值。第一个不会修改值。someFn(lev++)lev

于 2013-05-05T21:14:36.083 回答