0

友人は、これを再帰的に書くことはできないと私に賭けました。残念ながら彼は勝ちましたが、私はこれをどのように行うのかまだ疑問に思っています:

関数は次の とおりです。rw_in_range(開始、低、高)

入力は次のとおりです。

start - 「スリープウォーカー」の開始位置を表す正の整数

low - 「sleepwalker」が移動できる左端の位置を表す正の整数

high - 「夢遊病者」が移動できる右端の位置を表す正の整数

低 <= 開始 <= 高

この関数は、「sleepwalker」が低境界と高境界で指定された位置の範囲内をさまよっているランダム ウォークをシミュレートする必要があります。

夢遊病者は、関数の呼び出しによってサイズが指定されたランダムなステップを作成します。

def random_step():
    """ chooses a random step (-1 or 1) and returns it.
        inputs: none! However, make sure to use parens when calling it.
                For example: random_step()
    """
    return random.choice([-1, 1])

ランダム ウォークは、特定のステップによって "sleepwalker" が下限または上限のいずれかの境界に到達する/超えるまで継続する必要があります。この関数は、夢遊病者が停止位置に到達するまでに行った歩数を返す必要があります。

たとえば、最初の行にステートメントprint((' ' * start) + 'S')がある場合、次のようになります。

>>> rw_in_range(10, 5, 15)
      S
     S
    S
   S
    S
     S
    S
   S
  S
 S

9

私の機能は現在次のようになっています。

def rw_in_range(start, low, high):
    print(('' * start) + 'S')
    new_start=start + random_step()
    steps_in_rest= rw_in_range(new_start, low, high)
    if new_start==low or new_start==high: 
        return rw_in_range(new_start, low, high)

私の質問は、このシーケンスを再帰的に実行するようにコードを修正するにはどうすればよいですか? そのままでは値を返すことはないからです。

4

1 に答える 1

5

戻り時に再度呼び出しているため、関数は決して戻りません。これを試して:

def rw_in_range(start, low, high):
    print(('' * start) + 'S')
    new_start=start + random_step()
    if new_start<low or new_start>high: 
        return False
    rw_in_range(new_start, low, high)

ステップ数をカウントしたい場合、次のコードのようにリストを使用するのが最善の方法です。

import random

def random_step():
  return random.choice([-1, 1])

def rw_in_range(start, low, high, numberOfSteps):
  if start < low or start > high:
      return False
  print(' '*(low-1)+'|'+' '*(start-low) + 'S'+' '*(high-start)+'|')
  rw_in_range(start + random_step(), low, high, numberOfSteps)
  numberOfSteps[0] += 1
  return True

numberOfSteps = [0]
rw_in_range(10, 5, 15, numberOfSteps)
print numberOfSteps[0]



Output:
rw_in_range(10, 5, 15, numberOfSteps)
    |     S    |
    |    S     |
    |   S      |
    |    S     |
    |   S      |
    |  S       |
    |   S      |
    |  S       |
    |   S      |
    |  S       |
    |   S      |
    |  S       |
    |   S      |
    |  S       |
    |   S      |
    |  S       |
    |   S      |
    |  S       |
    | S        |
    |S         |
    | S        |
    |S         |

>>>print numberOfSteps[0]

22

関数のインターフェースを維持したい場合は、次のコードを使用します。

def rw_in_range(start, low, high):
    print((' ' * start) + 'S')
    new_start=start + random_step()
    if new_start<low or new_start>high: 
        return 0
    numberOfSteps = rw_in_range(new_start, low, high)
    return numberOfSteps + 1
于 2014-09-28T20:17:22.530 に答える