2017-10-26 5 views
1

제목은 조금 이상하지만, 나는이 온라인과 같은 코드를 발견했습니다이 호출되는 방법을 정확하게 알고, 그래서 PLZ 추상적 인 제목 ....자체 기능을 포함하는 기능?

저를 용서하지 마십시오

def lcs(xstr, ystr): 
    """ 
    >>> lcs('thisisatest', 'testing123testing') 
    'tsitest' 
    """ 
    if not xstr or not ystr: 
     return "" 
    x, xs, y, ys = xstr[0], xstr[1:], ystr[0], ystr[1:] 
    if x == y: 
     return x + lcs(xs, ys) 
    else: 
     return max(lcs(xstr, ys), lcs(xs, ystr), key=len) 

나는 파이썬에 새로운 오전, 나는 아직 완전히 정의되지 않은) 당신은 나의 이해, LCS으로

return x + lcs(xs, ys) 

(에 LCS (XS, YS)을 호출하는 방법을 이해하지 않고, 내가 ' 혼자서 어떻게 그 자체의 기능을 호출 할 수 있는지 혼란 스럽네요 ....

,

또한, 내가 어떻게 작동하는지 최대 (1, 2)을 알고 = LEN이

max(lcs(xstr, ys), lcs(xs, ystr), key=len) 

에서 무엇을하고 있는지 키 모르겠지만, 세 번째 매개 변수가 무엇을하고 있는지 모른다. "키"는 무엇을 의미하며, "키"의 값으로 "len"이 사용되는 이유는 무엇입니까?

+1

https://en.wikipedia.org/wiki/Recursion_(computer_science) – wwii

+0

* 정의 * 함수는 함수 자체가 정의되어 있지 않습니다. 그러나 함수 *는 호출 할 때 정의되므로 * NameError가 없습니다. –

답변

4

이것은 재귀라고합니다. 함수의 본문은 호출 할 때까지 전혀 평가되지 않습니다. 본체의 lcs을 이름으로 생각하십시오. 함수를 호출하면, 파이썬은 그것이 참조하는 것을보기 위해 어떤 이름에도 적용되는 동일한 검색 규칙을 적용 할 것이다. 일반적으로 * 동일한 기능을 나타냅니다.


* 일반적으로 이름이있는 일부 게임을 실행하여 재귀 함수를 중단 할 수 있기 때문에 * 일반적으로.

def foo(): 
    print("hi") 
    foo() 

g = foo 
def foo(): 
    print("new function") 

당신이 g()를 호출하면

, 출력됩니다 대신 인쇄 hi을 포함하는 라인의 무한 스트림의

hi 
new function 

. 파이썬이 호출 스택의 크기를 제한하기 때문에 결과적으로 거의 이됩니다.

+0

최대 기능의 세 번째 매개 변수가 무엇을 설명 할 수 있습니까? –

+1

별도의 질문으로 물어보십시오. (또는 더 나은 점은'max' 함수에 대한 문서를 읽는 것입니다.) – chepner

관련 문제