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) の戻り値は、非降順の要素を持つ合計のシーケンスとして評価されます。各被加数は、前よりも大きい (return g++;) または前と同じ (return g +fun()+fun()) です。return ステートメントの実行順序は、fun() 入力パラメーターのみに依存します。したがって、g を初期値 != 0 に設定すると、g=0 の場合と同じ加数が得られますが、すべての加数は同じ初期値に対して大きくなります。これにより、初期 g > 0 の fun(n) は、初期 g = 0 よりも大きいg * 実行された return ステートメントの数である値を返します。
fun(n)実行時のreturn文の実行回数をA(n)、if節でreturn文の実行回数をG(n)と定義する(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 では、評価順序の保証はありません。