你的问题,可以这么理解:
递归参数的传递,要看递归函数中对参数的赋值方法。
Sub InOrder(aBST, arr, aData, nPnt, nCount&)
其中nCount的赋值改变,是在递归函数处理过程中进行,
nCount = nCount + 1
而在参数传递过程中没有改变:
Call InOrder(aBST, arr, aData, aBST(nPnt, -1), nCount)
Call InOrder(aBST, arr, aData, aBST(nPnt, 0), nCount)
因此nCount在递归函数的参数传递过程中都是直接传递,保持不变。
赋值结果是 0,1,2,3,4,5,6
但是,Sub InOrder(aBST, arr, aData, nPnt, nCount&)中第4参数的nPnt
在递归参数传递过程中,每次都是重新赋值的,
Call InOrder(aBST, arr, aData, aBST(nPnt, -1), nCount)
Call InOrder(aBST, arr, aData, aBST(nPnt, 0), nCount)
即,nPnt = aBST(nPnt, -1)
或 nPnt = aBST(nPnt, 0)
这样的参数,当然也会在递归回溯时发生变化(回到赋值之前的状态)即参数有记忆。
而这参数的记忆特性,正是递归计算的魅力所在。
如果参数不能进行传递中的改变、以及回溯中的返回记忆,很多情况下递归算法也就没有办法得到正确结果了。
哈哈。
总之,一句话,在call 进入递归时,如果传递过程中参数有赋值改变,则会有记忆作用,
如果没有赋值改变,而只是直接传递,则不会因回溯而改变仅仅在过程中计算得到的赋值结果。
|