6

再帰を使用して、指定されたリストの逆を返す関数が必要です。どうやってやるの?

4

20 に答える 20

14

リストの最初の要素を反転したサブリストに追加します。

mylist = [1, 2, 3, 4, 5]
backwards = lambda l: (backwards (l[1:]) + l[:1] if l else []) 
print backwards (mylist)
于 2008-10-19T07:20:02.970 に答える
11

もう少し明示的に:

def rev(l):
    if len(l) == 0: return []
    return [l[-1]] + rev(l[:-1])

これは次のようになります。

def rev(l):
    if not l: return []
    return [l[-1]] + rev(l[:-1])

これは次のようになります。

def rev(l):
    return [l[-1]] + rev(l[:-1]) if l else []

これは別の答えと同じです。


テール再帰 / CPS スタイル (Python はとにかく最適化しません):

def rev(l, k):
    if len(l) == 0: return k([])
    def b(res):
        return k([l[-1]] + res)
    return rev(l[:-1],b)


>>> rev([1, 2, 3, 4, 5], lambda x: x)
[5, 4, 3, 2, 1]
于 2008-10-19T08:18:43.213 に答える
7

役に立たない回答であることは承知していますが (この質問は既に回答されています)、実際のコードではそうしないでください。Python は末尾呼び出しを最適化できず、関数呼び出しが遅く、再帰の深さが固定されているため、代わりに繰り返し実行する理由が少なくとも 3 つあります。

于 2008-10-19T08:50:19.483 に答える
4

秘訣は、再帰に参加することです。

デフ後方(l):
  そうでない場合:
    戻る
  x、y = l[0]、l[1:]
  後方に戻る(y) + [x]
于 2008-10-19T07:14:33.060 に答える
3

これはその場で反転します。(もちろん、反復バージョンの方が優れていますが、再帰的でなければなりませんよね?)

def reverse(l, first=0, last=-1):
    if first >= len(l)/2: return
    l[first], l[last] = l[last], l[first]
    reverse(l, first+1, last-1)

mylist = [1,2,3,4,5]
print mylist
reverse(mylist)
print mylist
于 2008-10-20T00:11:43.290 に答える
2
def revList(alist):
    if len(alist) == 1:       
        return alist #base case
    else:
        return revList(alist[1:]) + [alist[0]]

print revList([1,2,3,4])
#prints [4,3,2,1]
于 2016-01-30T04:21:54.567 に答える
1
def reverse(q):
    if len(q) != 0:
        temp = q.pop(0)
        reverse(q)
        q.append(temp)
    return q
于 2010-01-20T22:36:52.027 に答える
1

よりシンプルに見えます:

    def reverse (n):
        if not n: return []
        return [n.pop()]+reverse(n)
于 2017-03-07T09:56:20.617 に答える
0
def reverseList(listName,newList = None):
if newList == None:
    newList = []
if len(listName)>0:
    newList.append((listName.pop()))
    return reverseList(listName, newList)
else:
    return newList

print reverseList([1,2,3,4]) [4,3,2,1]

于 2016-02-28T06:09:27.143 に答える
0

最初の要素を取り、リストの残りを再帰的に反転し、最初の要素をリストの最後に追加します。

于 2008-10-19T07:02:44.113 に答える
0

可変のデフォルト引数と再帰を使用:

def hello(x,d=[]):
    d.append(x[-1])
    if len(x)<=1:
        s="".join(d)
        print(s)

    else:
        return hello(x[:-1])

hello("word")

追加情報

x[-1]    # last item in the array
x[-2:]   # last two items in the array
x[:-2]   # everything except the last two items

再帰部分はhello(x[:-1])、後で hello 関数を再度呼び出す場所です。x[:-1]

于 2016-10-11T13:05:51.017 に答える
0

これにより、ネストされたリストも逆になります。

A = [1, 2, [31, 32], 4, [51, [521, [12, 25, [4, 78, 45], 456, [444, 111]],522], 53], 6]

def reverseList(L):

    # Empty list
    if len(L) == 0:
        return

    # List with one element
    if len(L) == 1:

        # Check if that's a list
        if isinstance(L[0], list):
            return [reverseList(L[0])]
        else:
            return L

    # List has more elements
    else:
        # Get the reversed version of first list as well as the first element
        return reverseList(L[1:]) + reverseList(L[:1])

print A
print reverseList(A)

パドマルのブログ

于 2016-10-24T00:42:15.810 に答える
0

あなたが探している答えは関数の中にあります。残りの作業は、さまざまなアルゴリズムにかかる時間を確認する (または比較したい場合) だけです。

import time
import sys

sys.setrecursionlimit(10**6)


def reverse(ls1):
    if len(ls1) <= 1:
        return ls1
    else:
        ls1[0], ls1[-1] = ls1[-1], ls1[0]
        return [ls1[0]] + reverse(ls1[1:-1]) + [ls1[-1]]


ls = [*range(2000)]
start_time = time.time()
print(reverse(ls))
stop_time = time.time()
print(f"Total time taken: {(stop_time - start_time) * 1000} msec.")
于 2021-06-20T14:28:59.550 に答える
-1

なぜだめですか:

a = [1,2,3,4,5]
a = [a[i] for i in xrange(len(a)-1, -1, -1)] # now a is reversed!
于 2016-10-11T13:16:19.467 に答える
-1
def disp_array_reverse(inp, idx=0):
    if idx >= len(inp):
        return
    disp_array_reverse(inp, idx+1)
    print(inp[idx])
于 2021-06-01T18:28:28.027 に答える