4

わかりません。どうすれば a のList代わりに a を返すことができNoneますか?

class foo():
    def recursion(aList):
        if isGoal(aList[-1]):
            return aList
        for item in anotherList:
            newList = list(aList)
            newList.append(item)
            recursion(newList)

    someList = [0]
    return recursion(someList)

基本的に、コードはすべてのパスを記録することです (0 から始まります)。先に100をとった人が返還されます。isGoal()パスの最後の項目が 100 かどうかを確認します。またanotherList、乱数 (0 から 100 まで) の小さなリストです。

4

2 に答える 2

16

return声明

この問題は、私が最初に再帰を学び始めたとき、実際に理解するのにかなりの時間を要しました。

Python の関数/メソッドを扱う際に留意すべきことの 1 つは、それらが何であっても常に値であるということです。 returnしたがって、関数/メソッドの本体でステートメントを宣言するのを忘れるとreturn、Python が代わりにそれを処理return Noneし、最後に実行します。

これが意味することは、関数の本体を台無しにして を置き忘れreturnたり省略したりすると、予想される戻り値の代わりに が出力されるということprint type(messed_up_function())ですNoneType

再帰修正

それを念頭に置いて、再帰を扱うときは、最初に帰納的なケース以外に基本的なケースがあることを確認してください。つまり、無限再帰ループを防ぎます。

次に、両方のケースで戻っていることを確認してください。つまり、次のようになります。

def recur(val):
    """
    takes a string
    returns it back-to-front
    """
    assert type(val) == str
    # the base case
    if len(val) == 1:
        return val
    # the inductive case
    else:
        return val[-1] + recur(val[:-1]) # reverses a string char by char

したがって、これは常にreturns であり、100% の無限再帰証明です。これは、有効な基本ケースと帰納ステップごとに減分された長さがあるためです。

再帰関数をデバッグする Stack Viewer

recur('big')基本ケースの開始時に を追加して実行するassert False場合、次のスタック構造になります。

範囲

そこから、各再帰ステップで、valこの関数の唯一のパラメーターである が、ヒットするまでどんどん小さくなりlen(val) == 1、最終的な戻り値、この場合は に到達することがわかりますassert False。したがって、これは再帰関数/メソッドをデバッグするための便利な方法です。IDLEではDebug > Stack Viewer、シェルで呼び出して、このようなビューにアクセスできます。

于 2013-03-11T14:10:26.517 に答える
0

関数は次のとおりです。

def recursion(aList):
    if isGoal(aList[-1]):
        return aList
    for item in anotherList():
        newList = list(aList)
        newList.append(item)
        recursion(newList) # here you ignore what recursion returns
    # when execution reaches this point, nothing is returned

実行が追加されたコメントに達すると、forループが完了した後、関数は終了し、何も返されません。returnまた、ステートメントを実行せずに関数を終了すると、Noneが返されます。再帰関数から何かを返すことを確認する必要があります。

関数が何をしようとしているのかわからないので、関数を書き直す方法についてアドバイスすることはできません。それをどのように変更する必要があるかは、私には明らかではありません。しかし、私が完全に自信を持って言えることは、あなたは何かを返さなければならないということです!

于 2013-03-11T13:50:57.007 に答える