-1

使用する代わりに再帰を使用する目的はfor i in range(11):、特定の数学的問題を解決しようとして上から始めるのが有利だからです。[n]関数は、特定の基準に一致するもののみを返すように変更されます。

print(numbers)=[[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]]余分なブラケットがあるのはなぜですか? print(numbers[7])=IndexError: list index out of rangeこれは余分なブラケットと関係がありますか?

# A function that is supposed to help sorting numbers in a list
def sorting_numbers(n):
    if n > 1:
        return [n] + sorting_numbers(n-1)
    else:
        return [1]

numbers = []
n = 10
numbers = (sorting_numbers(n))
print(numbers)

print(numbers)=[[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]]余分なブラケットがあるのはなぜですか? print(numbers[7])=IndexError: list index out of rangeこれは余分なブラケットと関係がありますか?

4

2 に答える 2

0

このような単純な問題に本当に再帰を使用したい場合は、非常に非効率的であり、に近いmaximum recursion depth exceeded値に対してエラーが発生することに注意してください(Python は再帰を効率的に処理するように設計されていません)。n1000

def storing_numbers(n):
    if n > 1:
        return [n] + storing_numbers(n-1)
    else:
        return [1]

またはもう少し短い:

def storing_numbers(n):
    return [] if n <= 0 else [n] + storing_numbers(n-1)

途中でリストを作成する方法と、基本ケースもリストを返すことに注意してください。次のように使用します。

numbers = storing_numbers(10)
numbers
=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

もちろん、学術的な演習以外の目的でリストを作成するために再帰関数を使用するのは非現実的です。実際の実用的な実装では、代わりにこれを行います。

list(range(10, 0, -1))
=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

そして、リスト内包表記を使用して、特定の基準に一致する数値、たとえば偶数のみをフィルター処理する方法を次に示します。

[x for x in range(10, 0, -1) if x % 2 == 0]
=> [10, 8, 6, 4, 2]
于 2013-08-07T22:12:33.067 に答える
0

再帰呼び出しを行うたびに、タプルを返します: (number, recursive_result). したがって、再帰するたびに、タプルの別のレイヤーが最終結果に埋め込まれます。

からの数値を入力数値に合計するだけの意図のように見える1ので、修正するために必要なのは、3行目を変更して、両方を完全に返すのではなく、再帰呼び出しの結果と元の数値を返すことだけです .

def function(number):
    if number > 1:
        # return the recursive result added to the original number
        return number + function(number-1) 
    else:
        return number

補足として、目的が明確になるように、関数にわかりやすい名前を付ける必要があります。

于 2013-08-07T21:19:26.127 に答える