如果我们将 g+fun(h-1)+fun(n-4) 中的求和顺序定义为从左到右,那么这是一个很好定义的问题。这样我得到了 fun(n), n=1,...,15 的值:
3, 6, 10, 15, 33, 74, 154, 295, 575, 1143, 2269, 4414, 8508, 16396, 31634
fun(n) 的返回值被评估为具有非降序元素的求和序列。每个加数都比前一个大(返回 g++;)或与前一个相同(返回g +fun()+fun())。返回语句的执行顺序仅取决于 fun() 输入参数。因此,将 g 设置为初始值!= 0 我们得到与 g=0 相同的加数,但对于相同的初始值,每个加数都更大。这样,初始 g > 0 的 fun(n) 将返回g * 执行的返回语句数,大于初始 g = 0 的值。
将 A(n) 定义为执行 fun(n) 时执行的 return 语句数,以及 G(n) 在if子句中执行的 return 语句数(与 g++ 语句执行数相同)。对于 A 和 G 成立:
A(n) = A(n-1) + A(n-4) + 1
G(n) = G(n-1) + G(n-4)
A(n) = 1 and G(n) = 1, for n <= 0
从这些观察可以看出,对于 n > 0 成立:
fun(n) = fun(n-1) + G(n-1) * A(n-4) + fun(n-4)
简单的python实现:
def x( h ):
Rg = { -3:1, -2:1, -1:1, 0:1 }
Ra = { -3:1, -2:1, -1:1, 0:1 }
F = { -3:1, -2:1, -1:1, 0:1 }
for i in xrange( 1, h+1 ):
F[i] = F[i-1] + Rg[i-1]*Ra[i-4] + F[i-4]
print i, F[i]
Rg[i] = Rg[i-1] + Rg[i-4]
Ra[i] = Ra[i-1] + Ra[i-4] + 1
@stakx:对于表达式 g+fun(h-1)+fun(h-4) 我们不能有评估顺序保证,尤其是在 C 中。