Python의 재귀를 사용하여 목록을 반전하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/216119

  •  03-07-2019
  •  | 
  •  

문제

재귀를 사용하여 주어진 목록의 반전을 반환 할 함수를 원합니다. 어떻게 할 수 있습니까?

도움이 되었습니까?

해결책

목록의 첫 번째 요소를 역방향 하위 목록에 추가하십시오.

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 []

다른 대답과 동일합니다.


Tail Recursive / 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 가지 이상 있습니다.

속임수는 가입하는 것입니다 ~ 후에 재귀 :

def backwards(l):
  if not l:
    return
  x, y = l[0], l[1:]
  return backwards(y) + [x]
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]

분열 및 정복 전략을 사용하십시오. D & C 알고리즘은 재귀적인 알고리즘입니다. D & C를 사용 하여이 문제를 해결하려면 두 단계가 있습니다.

  1. 기본 케이스를 파악하십시오. 이것은 가능한 가장 간단한 경우 여야합니다.
  2. 기본 케이스가 될 때까지 문제를 나누거나 줄입니다.

1 단계 : 기본 케이스를 알아냅니다. 가장 간단한 목록은 무엇입니까? 0 또는 1 요소의 목록을 얻으면 요약하기가 매우 쉽습니다.

if len(l) == 0:  #base case
    return []

2 단계 : 모든 재귀 통화마다 빈 목록에 가까이 이동해야합니다.

recursive(l)    #recursion case

예를 들어

l = [1,2,4,6]
def recursive(l):
    if len(l) == 0:
        return []  # base case
    else:
        return [l.pop()] + recursive(l)  # recusrive case


print recursive(l)

>[6,4,2,1]

출처 : Grokking 알고리즘

이것은 바로 역전됩니다. (물론 반복 버전이 더 나을 것이지만 재귀 적이어야합니까?)

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 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

인쇄 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]) 그 후 다시 호출하는 곳 x[:-1]

왜 안 돼:

a = [1,2,3,4,5]
a = [a[i] for i in xrange(len(a)-1, -1, -1)] # now a is reversed!

이것은 중첩 된 목록도 되돌립니다!

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)

Padmal의 블로그

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top