2011-01-12 18 views
1

は例えば、私は次の再帰を持っていると私はfを取得したい[3、n]は:mathematicaで再帰関係を解析的に解く方法は?

f[m_, n_] := Module[{}, If[m < 0, Return[0];]; 
    If[m == 0, Return[1];]; 
    If[2*m - 1 >= n, Return[0];]; 
    If[2*m == n, Return[2];]; 
    If[m == 1, Return[n];]; 
    Return[f[m, n - 1] + f[m - 1, n - 2]];] 
f[3, n] 

コードが動作するようには思えません。助けてください。どうもありがとう!

+0

正確に「動作していないようですか? –

+1

このコードが分析的/象徴的な回答を与えると期待する理由はありません。あなたが象徴的なものにしたいコマンドは 'RSolve []'ですが、多変量再帰関係にはあまりよくありません。 – Simon

+1

@シモンこのケースでは "それほど良くない"というと丁寧です:D –

答えて

3

mが初期化されていない場合、境界ケースが一致しないため、無限再帰があります。あなたは関数型プログラミングを使用している場合、すなわち

f[m_, n_] := Which[ 
    m < 0, 0, 
    2 m - 1 >= n, 0, 
    2 m == n, 2, 
    m == 1, n, 
    True, f[m, n - 1] + f[m - 1, n - 2] 
    ] 

この場合Whichnが初期化されていないと取るためにどのオプションを決めることができないので、f[3, n]が返され、より予測可能な動作を得るでしょう代わりにReturnを使用しての

表現。

式を取得する1つの方法は、RSolveです。あなたは、任意の反復変数とC[1]あるK[1]が表示されます、それは完全に一般に、この方程式を解くことができるようには見えませんが、その結果、この

Block[{m = 3}, 
RSolve[f[m, n] == f[m, n - 1] + f[m - 1, n - 2], f[m, n], {n}] 
] 

のようなものを使用して、固定変数1でそれを試すことができます自由定数です。境界ケースが指定されていないためにそこにあります

+0

申し訳ありませんが、私が与えた再帰は自己矛盾しています。代わりに次のものがある場合: –

+0

"mが初期化されていません"(/.m->n)にタイプミスがありますか? –

関連する問題