문제

나는 이것이 어리석은 질문처럼 들릴 수도 있다는 것을 알고 있지만, 내가 마지막으로 프로그래밍했을 때 어셈블러에서 프로그래밍했기 때문에 내 생각이 틀렸을 수도 있습니다.

재귀 함수는 다음과 같습니다.

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'가 헤어질 루프라고 생각하지 말고, 수익은 단순히 보류중인 몇 가지 실행 중 하나를 마무리합니다.

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