再帰を使用して、指定されたリストの逆を返す関数が必要です。どうやってやるの?
20 に答える
リストの最初の要素を反転したサブリストに追加します。
mylist = [1, 2, 3, 4, 5]
backwards = lambda l: (backwards (l[1:]) + l[:1] if l else [])
print backwards (mylist)
もう少し明示的に:
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]
役に立たない回答であることは承知していますが (この質問は既に回答されています)、実際のコードではそうしないでください。Python は末尾呼び出しを最適化できず、関数呼び出しが遅く、再帰の深さが固定されているため、代わりに繰り返し実行する理由が少なくとも 3 つあります。
秘訣は、再帰後に参加することです。
デフ後方(l): そうでない場合: 戻る x、y = l[0]、l[1:] 後方に戻る(y) + [x]
これはその場で反転します。(もちろん、反復バージョンの方が優れていますが、再帰的でなければなりませんよね?)
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
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]
def reverse(q):
if len(q) != 0:
temp = q.pop(0)
reverse(q)
q.append(temp)
return q
よりシンプルに見えます:
def reverse (n):
if not n: return []
return [n.pop()]+reverse(n)
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]
最初の要素を取り、リストの残りを再帰的に反転し、最初の要素をリストの最後に追加します。
可変のデフォルト引数と再帰を使用:
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]
これにより、ネストされたリストも逆になります。
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)
あなたが探している答えは関数の中にあります。残りの作業は、さまざまなアルゴリズムにかかる時間を確認する (または比較したい場合) だけです。
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.")
なぜだめですか:
a = [1,2,3,4,5]
a = [a[i] for i in xrange(len(a)-1, -1, -1)] # now a is reversed!
def disp_array_reverse(inp, idx=0):
if idx >= len(inp):
return
disp_array_reverse(inp, idx+1)
print(inp[idx])