2009-10-21 4 views
4

난이 바보 같은 질문처럼 들릴지 실현,하지만 난 그게 어셈블러에 있던 프로그램의 마지막 시간이 너무 내 생각이있을 수 있습니다 오프 : 그래서재귀 - 파이썬, 반환 값 질문

재귀 함수 :

왜 함수가 n == 0에 도달하면 1을 반환하지 않고 계승 인 대답을 반환하는 이유는 무엇입니까? 나는 그것이 될 것 어셈블러 같은 것을 생각하고 n이 == 0 :

mov eax, 1 
ret 

않는 이유는 무엇 일, 내가 파이썬 반환하는 조건 전에 스택의 마지막 값을 가정 위의 코드?

답변

12

예를 들어 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) 등으로 반환됩니다.

+2

+1 : "함수"의 반환 값은 많은 곱셈과 함수 호출을 포함하는 전체 식의 반환 값이 아닙니다. 그것은 "호출 스택"과 함수가 평가되는 컨텍스트에 관한 것입니다. –

+0

'fac (0)'은 1이 아니라 0이 아닙니다. – Gumbo

+0

정말 고맙습니다. 그러나 나는 그것이 내 실수였던 다른 방법이라고 생각했다. 이것은 지금 완벽하게 이해된다, 환호! –

1

은 n == 0 일 때 1을 반환합니다. 반환 값은 호출 사이트에서 스택에서 꺼내졌으며 호출은 n * fac(n - 1)입니다. 그 1n 곱한 반환 등

+0

네,하지만 n == 4라고 말하면, 논리가 n == 0, 즉 더 이상 숫자가 늘어나지 않을 때 줄의 끝에 도달 할 때까지 카운터를 반복하고 감소시킵니다. 아마도 여기에 아주 기본적인 것을 혼란스럽게 만들었지 만, 파이썬이 재귀를 어떻게하는지에 대한 설명은 찾지 못했습니다. do while 루프에서도이 함수를 사용할 수 있습니다. 그러면 더 명확 해집니다. 그러나 지금 쓰여진대로 나는 논리를 따르지 않는다. –

0

fac (0)을 호출하면 1이 반환됩니다 (0이 아님). 질문에 오타가 있다고 가정합니다. fac (1)을 호출하면 else 절로 넘어 가서 거기에 fac(0)이 호출됩니다. 그러면 1을 반환합니다. 그러면 n * 1을 1로 계산하고이를 반환합니다. fac(2)을 호출하면 else 절로 이동하여 위에 언급 한대로 1을 반환하는 fac(1)을 호출하므로 n*fac(n-1)은 2가되고 그 값은 fac(2)이됩니다. 등등. 나는 당신을 위해 그것을 설명하기를 바란다.

0

아무 것도 암시 적으로 반환되지 않습니다. n = 0 일 경우 함수는 if 문을 입력하고 return 1 문에서 직접 1을 반환합니다. 그러나 이것은 "계계는 계계입니까?"가 사용자에게 반환되는 시점이 아닙니다. 대신이 값을 n * fac(n - 1) 분기의 중간에있는 함수가 fac (1)에 의해 호출 된 함수로 반환 할 수 있습니다. 따라서 "1"을 반환하고 n*1을 반환합니다.이 번호는 1 ~ 입니다. 발신자는입니다. 그게 fac (2)이면 n * 1, 또는 2가 이 되니, 발신자입니다.

(5)와 같이 변환됩니다 따라서 FAC :

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 값은 (는) 첫 번째 호출자에게 돌아갈 않는 각 상위 계층을 반환하고, 각 단계에서 곱셈은 당신에게 해답을 제공됩니다 후에 만 .

0

제임스, 함수 (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'가 나오는 루프로 생각하지 마십시오. 리턴은 단순히 여러 보류중인 실행 중 하나를 마칩니다.