0

この関数をどのように記述しますか:私の質問(最初の答え)、Python で再帰的に? これは私がこれまでに持っているものです:

def f(n, p, k, t):
    sum(for p in xrange(1, 7):
        sum(for i in xrange(1,7):
                if n == 3: return 1
                if k == 1: return 0
                return (1/36) * f(n-1,p,k-1,t-max(p,i))
            )
        )

print sum([f(5,j,3,15) for j in xrange(1, 7)])

どんな助けでも感謝します、ありがとう! :D

編集:リンクからの質問はこれです:

「私が 5 (n)、6 面 (d) の通常のサイコロを持っているとしましょう。可能なロールがいくつあるのか、上位 3 (k) の数字が 15 (t) に等しい場合、どうすればわかりますか?基本ケースが別のものである f(n,d,k,t)=∑i=1jf(something,with,n,d,k,t...) などの再帰を使用してこれを行います。これは? 助けてください. ありがとう.

私が得た答えは:

私のコメントから外れて、現在のトップkにないトップダイであるパラメーターpを追加すると(とにかくすべてのサイコロは6面であるため、dを破棄します)、次のようになると思います:f( n,p,k,t)=∑p′=16∑i=16136⋅f(n−1,p′,k−1,t−(max(p′,i))) 変数 i は結果を表す次のさいころが投げられる。

これが正しいかどうかはわかりません。私はその質問に魅了され、試してみたいと思いました。これが私が思いついたものです。

合計 15 の最終的な確率は、n=3,k=1 の再帰ベース ケースで ∑p=16f(5,p,3,15) になります。

このような再帰を考え出す背後にある一般的な考え方は次のとおりです。状態 A に到達する確率を知りたいとします。次に、A にすぐに到達できるすべてのケースを調べ、それらの状態に到達する確率に次の確率を掛けます。その「前状態」から A に到達します。次に、これをすべての事前状態で合計します。

コピーしなかった理由は、シグマ表記と LaTeX のビットとピースが stackoverflow に表示されないためです。

4

1 に答える 1

1

いくつかのビットが混在しているだけです。

for ループとジェネレータ式

ループの場合:

for p in range(1, 7):
    statement()

ジェネレータ式:

expression() for p in range(1, 7)

コロンがなく、値が . の前にあることに注意してくださいfor

If ステートメントと条件式

If ステートメント:

if predicate():
    true_stmt()
else:
    false_stmt()

式の場合:

true_expr() if predicate() else false_expr()

それを一緒に入れて

def f(n, p, k, t):
    return sum(sum(1 if n == 3 else
                   (0 if k == 1 else
                    (1/36) * f(n-1, p, k-1, t-max(p,i))))
                   for i in range(1, 7))
               for p in range(1, 7))
于 2013-02-20T22:47:53.173 に答える