在递归期间为变量赋值

时间:2013-05-05 21:10:15

标签: recursion dart

所以我有一个列表([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++levlev++的不同之处在于它实际上并未为lev分配值。我想知道的是,当我将lev分配给一个新值时,在递归过程中发生了什么,以及为什么它对于一个postcrement和precrement是不同的。

3 个答案:

答案 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的值。第一个不会修改该值。