재귀 - Python, 반환 값 질문
문제
나는 이것이 어리석은 질문처럼 들릴 수도 있다는 것을 알고 있지만, 내가 마지막으로 프로그래밍했을 때 어셈블러에서 프로그래밍했기 때문에 내 생각이 틀렸을 수도 있습니다.
재귀 함수는 다음과 같습니다.
def fac(n):
if n == 0:
return 1
else:
return n * fac(n - 1)
함수가 n == 0에 도달하면 1을 반환하지 않고 계승인 답을 반환하는 이유는 무엇입니까?나는 어셈블러에서 n == 0일 때와 같은 것을 생각하고 있습니다.
mov eax, 1
ret
위의 코드가 작동하는 이유는 무엇입니까? Python이 해당 조건 이전에 스택의 마지막 값을 반환한다고 가정합니까?
해결책
이렇게 생각하십시오 fac(5)
예를 들어:
return 5 * fac(4)
return 4 * fac(3)
return 3 * fac(2)
return 2 * fac(1)
return 1 * fac(0)
1
그래서 1
할 것입니다 첫 번째 반품 값이지만 반환됩니다 fac(1)
그리고 fac(1)
반환됩니다 fac(2)
등등.
다른 팁
그것 하다 N == 0.이면 1 회 반환 1 n * fac(n - 1)
. 저것 1
곱합니다 n
그리고 반환, 등
FAC (0)를 호출하면 1 (0이 아닌 0이 아니지만 질문에서 오타라고 생각합니다). FAC (1)에게 전화하면 다른 조항으로 이동하면 전화합니다. fac(0)
. 이것은 반환됩니다. 그런 다음 1 인 n*1을 계산하여 반환합니다. 전화하면 fac(2)
그것은 또한 다른 조항에 들어가서 전화 할 것입니다. fac(1)
위에서 언급했듯이 1은 1입니다 n*fac(n-1)
2가 될 것입니다. fac(2)
. 등등. 나는 그것이 당신을 위해 그것을 설명하기를 바랍니다.
아무것도 암시적으로 반환되지 않습니다. n=0일 때 함수는 if 문을 입력하고 if 문에서 직접 1을 반환합니다. return 1
성명.그러나 이것은 "팩토리얼인 답변"이 사용자에게 반환되는 시점이 아닙니다.대신 이 값을부름 fac(1)에 의해 호출되는 함수입니다. n * fac(n - 1)
나뭇가지.따라서 "1"이 반환되고 반환됩니다. n*1
, 이는 1 ~ 그것은 방문객.그것이 fac(2)라면, 반환될 것입니다. n * 1
, 또는 2~ 그것은 발신자 등.
따라서 fac(5)는 다음과 같이 번역됩니다:
fac(5) = 5 * fac(4) = 5 * (4 * fac(3) = 5 * (4* (3 * fac(2)) = 5 * (4* (3 * (2 * fac(1)) = 5 * (4* (3 * (2 * (1 * fac(0)) = 5*4*3*2*1*1
각 상위 레이어를 통해 1의 값이 반환된 후에야 첫 번째 호출자에게 돌아가고, 각 단계의 곱셈을 통해 답을 얻을 수 있습니다.
제임스, 제임스, 당신의 기능에 대한 최종 호출 (n == 0)이 반환 될 때 통화 스택에서 FAC (N)의 여러 인스턴스 중 하나 일뿐입니다. 인쇄 (FAC (4))라고 말하면 스택은 본질적으로 다음과 같습니다.
fac(0)
fac(1)
fac(2)
fac(3)
fac(4)
print()
FAC에 대한 최종 호출 (0)은 1을 적절하게 반환하지만, 파이썬에서는 FAC (N), FAC (4)에 대한 첫 번째 호출의 반환 값을 요청했습니다.
그것을 'ret'가 헤어질 루프라고 생각하지 말고, 수익은 단순히 보류중인 몇 가지 실행 중 하나를 마무리합니다.