0

私はPythonの初心者ですが、組み込みの範囲関数と同じように機能する再帰関数を作成しようとしています:

def Range (lo, hi):
    if lo >= hi:
        return []
    else:
        return [lo, Range (lo+1,hi)]

しかし、複数のリストを返します。

の代わりに[3,4,5,6]、これは私が欲しいものですが、それが返されるの[3,[4,[5,[6,[]]]]] はなぜですか?どうすれば修正できますか?

4

4 に答える 4

5

そのように再帰すると、Range毎回リストが返されます。

Range(3,7)
# translates to
[3, Range(4,7)]
# which translates to
[3, [4, Range(5,7)]]
# etc.

これを回避するには、リストをまとめて追加します。

def Range (lo, hi):
    if lo >= hi:
        return []
    else:
        return [lo] + Range(lo+1, hi)

編集:

@delnan が指摘しているように、この関数は非常に非効率的です。末尾呼び出しの最適化を行わない言語で再帰を行い、再帰のレベルごとに2 つ (場合によっては3 つ) の新しいリストを生成します。 @mipadi の回答は、1 つのリスト (または引数) のみを作成し、再帰として渡すため、パフォーマンスが向上します。accaccumulator

* これは Python 言語には当てはまらないかもしれませんが、Python の最も一般的な実装、つまり CPython には当てはまると 99% 確信しています。

于 2011-11-15T18:54:03.457 に答える
3

関数Rangeはリストを返すため、最後の行ではリスト内のリストを返しています。おそらくすべきことは、アキュムレータを維持し、それに値を追加することです:

def Range(lo, hi, acc=None):
    if acc is None:
        acc = []
    if lo >= hi:
        return acc
    else:
        acc.append(lo)
        return Range(lo+1, hi, acc)
于 2011-11-15T18:54:17.047 に答える
1
def Range (lo, hi):
    if lo >= hi:
        return []
    else:
        return [lo] + Range (lo+1, hi)

ただし、StackOverflow が発生する可能性があります

于 2011-11-15T18:54:15.490 に答える
0

Range への各再帰はリストを返します。これは、前の再帰のリストの 2 番目の要素です。もちろん、Python には this の組み込み関数がありますが、自分でビルドしたい場合は、おそらく終了したいだけです

return [lo] + Range(lo+1, hi)
于 2011-11-15T18:55:55.863 に答える