2014-10-23 7 views
2

저는 루비 도전 과제를 만들고 숫자의 계승을 계산하는 방법을 써야했습니다. 나는 아래의 솔루션을 통해 온,하지만 난 그게 else 문에, 특히 부분을 어떻게 작동하는지 이해하지 않는다 :이 방법으로 내 계승을 해결할 수 있습니까?

def factorial(number) 
    if number <= 1 
    1 
    else 
    number * factorial(number - 1) 
    end 
end 

내가 (5) 어떻게 다른 문을 통해 반복되는 계승을 실행 말할 수 있습니다 숫자 * 계승 (숫자 - 1) 진술에 5 * 4 * 3 * 2 * 1? 아마도 이것이 분명해야 할 것처럼 보이지만 그것은 나를위한 것이 아닙니다. 도움을 미리 감사하십시오.

답변

5

이 개념은 recursion으로 알려져 있습니다.

계승 (5) 평가

5 * factorial(4) 

에 계승 (4)

4 * factorial(3) 

요인 평가 (3)

3 * factorial(2) 

요인 평가 (2)

평가
2 * factorial(1) 
적절하게
5 * factorial(4) 
5 * 4 * factorial(3) 
5 * 4 * 3 * factorial(2) 
5 * 4 * 3 * 2 * factorial(1) 
5 * 4 * 3 * 2 * 1 
+0

당신의 대답을 들었을 때 나는 그저 나의 이해를 쓰고 있었다. 그래서 else 문장에서는 -1이라는 방법을 통해 스스로를 계속해서 호출한다. 1이되면 멈 춥니 다. 옳은? – theartofbeing

+1

맞습니다. 이는 else 분기가 평가 될 때만 메소드가 자신을 호출하기 때문입니다. n = 1 일 때 재귀 호출은 없으며 if 분기 만 계산됩니다. – hjing

1

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.