는 else
에서 factorial
전화
결과 1 대체 값
1 <= 1
때문에, 즉 recursion의 예에
계승 (1) 평가 : 당신이 현재하고있는 함수를 호출 그 자체에서. 이상하게 들리지만 실제로하고있는 일은 새로운 인수를 사용하여 새 복사본을 호출하는 것입니다. 어디가 새 복사본 완료되면 다시 이동하는 기억하면서 흐름이, 함수의 상단에서 또 다시 시작하는 것이 어떤 의미 : 그래서
당신이하지 첫 번째 전화 factorial(5)
:
def factorial(5)
if 5 <= 1
1
else
5 * factorial(5 - 1)
을 자, 이제 우리는 계속하기 전에 factorial(5-1)
을 호출하고 반환 값을 사용하여 그 표현식을 대체해야합니다.
def factorial(4)
if 4 <= 1
1
else
4 * factorial(4 - 1)
Whups, 다른 재귀 호출 : 이미 단 4 우리가 재귀 호출 인수에 도착하는 시간에 의해, 그래서 물론, 루비는 호출하기 전에 빼기를한다. 여기에서 우리는 다시 간다 : 다시
def factorial(3)
if 3 <= 1
1
else
3 * factorial(3 - 1)
과 :
def factorial(2)
if 2 <= 1
1
else
2 * factorial(2 - 1)
그리고 한 번 더 :
def factorial(1)
if 1 <= 1
1
당신의 말을 잡아! 1은 실제로 1보다 작거나 같기 때문에 이번에 else
절을 치지 않습니다.우리는 단지 factorial(2)
사본이 우리의 발신자 최대 1을 반환 - 그래서 2 * factorial(1)
했다 경우, 우리는 단지 1 인 반환 값 factorial(1)
을 대체 :
2 * 1
end
end
그래서 지금은 발신자, 2를 반환을하는 factorial(3)
사본이었습니다. 즉 3 * factorial(2)
이되고 있다는 것을 의미 단지 3 * 2
:
3 * 2
end
end
그리고 factorial(4)
사본 최대
,
4 * factorial(3)
이
4 * 6
된다 :
4 * 6
end
end
그리고 마지막으로, 다시 우리의 원래 factorial(5)
전화의 상단까지 5 * factorial(4)
가 될 것으로`(5) * 24 :
5 * 24
end
end
물론 원하는 것은 물론입니다. 대답 120.
당신의 대답을 들었을 때 나는 그저 나의 이해를 쓰고 있었다. 그래서 else 문장에서는 -1이라는 방법을 통해 스스로를 계속해서 호출한다. 1이되면 멈 춥니 다. 옳은? – theartofbeing
맞습니다. 이는 else 분기가 평가 될 때만 메소드가 자신을 호출하기 때문입니다. n = 1 일 때 재귀 호출은 없으며 if 분기 만 계산됩니다. – hjing