2017-04-25 15 views
0

私はpython 3.4を使用しています。再帰的推測ゲームを作ろうとしています。ゲームは最小値と最大値をとり、「マジック」番号を持つ必要があります。ゲームは、xとyの間の範囲で乱数を生成します。次に、ユーザーにyを挿入するように依頼します。lは小さすぎ、hは高すぎます。それが「おめでとう」メッセージであれば、終了します。値が小さすぎる場合は、最小値xをとり、1を加算すると、新しい最小値になります。あまりにも高いために同じロジック。次に乱数を生成する。 Imは再帰をどこに呼び出すかに拘束されています。再帰的推測ゲーム

def recursive_guess(x,y,): 
correct = False 
while not correct: 

    print('I will guess a number y for yes, l for too low, h for too high') 
    guess = random.randrange(x, y) 
    print(guess) 
    anwser = input('y for yes l for low h for high') 
    if anwser == 'y': 
     print('Got it right') 
     correct = True 
    elif anwser == 'l': 
     guess = random.randrange(minVal + 1, maxVal) 
    elif anwser == 'h': 
    guess = random.randomrange(minVal, maxVal-1) 
+0

なぜ再帰を使用していますか?これは反復ループの基本的な演習であり、実際には再帰的な問題ではありません。ユーザーが境界を制御できるようにするからです。 – Prune

+0

彼はおそらく再帰を練習している、それには何も問題はない。また、それは再帰のための良い問題です。 "それは本当に再帰的な問題ではない"あなたの意見ですが、議論するのは無頓着です。 – Apollys

答えて

0

私はあなたが構文の詳細に巻き込まだとまだあなたの頭の中で自分のアルゴリズムの全体像を持っていないと思うので、のは、高レベルの擬似コードに切り替え、あなたの変数より良い名前を挙げてみましょう。与えられたあなたのコードで

def recursive_guess(lower_bound, upper_bound): 
    guess = random guess in range [lower_bound, upper_bound] 
    print guess 
    request user response 
    response = <get user response> 
    if guess was too high: 
    upper_bound = guess - 1 
    elif guess was too low: 
    lower_bound = guess + 1 
    else: 
    return guess 
    # assuming we reached this point without returning, 
    # we need to do a recursive call because guess was wrong 
    return recursive_guess(lower_bound, upper_bound) 

、あなたは再帰的なアプローチでオフに開始しているように見えるが、その後、あなたはすぐにあなたが新しいランダムな値に再びあなたの推測を更新して、反復的なアプローチに(無意識のうちに)切り替えます。あなたが最初にやったのと同じように機能の終わりに同じことをしたら、それはおそらくあなたがすでに再帰していたはずであるということをあなたに示唆することができます。

単純にタスクをわずかに小さくしてから、すでに完了していると考えてください。この場合、ウィンドウサイズ(upper_bound - lower_bound)を減らすことができれば、私たちは仕事を終えました。再帰は、ベースケースがある限り、そこから処理されます。このシナリオでは、ベースケースが正しく推測されており、その場合はすぐに戻ります。

0

代わりguess = random.randrange(minVal + 1, maxVal)、あなたはこのように、MINVALを変更し、それを使用する必要があります。

minVal = guess + 1 
guess = random.randrange(minVal, maxVal) 

そうでない場合は、MINVALとMAXVALは、正しい番号にで閉じません。 minValとmaxValは実際には変更されないため、elif文の推測は毎回同じです。また、minValとmaxValがxとyに設定されている場所が見えません。

編集:再帰性が出現する場所がわからない場合は、この関数を再帰的にしたい場合は、whileループから取り出して、それ自身を呼び出すことができます。つまり、上の行ではなくrecursive_guess(guess + 1, y)です。