[function] 재귀 함수 작동 방식 이해

제목이 설명 하듯이, 저는 아직까지 파악할 수 없었던 매우 기본적인 프로그래밍 질문이 있습니다. 모든 (매우 영리한) 필터링 “재귀를 이해하려면 먼저 재귀를 이해해야합니다.” 다양한 온라인 스레드에서 답장을 보내지 만 아직 잘 모르겠습니다.

우리가 모르는 것을 알지 못하는 상황에 직면했을 때 잘못된 질문을하거나 올바른 질문을 잘못하는 경향이 있음을 이해합니다. 비슷한 견해를 가진 사람이 일부를 공유 할 수 있기를 바랍니다. 저를 위해 재귀 전구를 켜는 데 도움이 될 약간의 지식!

다음은 함수입니다 (구문은 Swift로 작성 됨).

func sumInts(a: Int, b: Int) -> Int {
    if (a > b) {
        return 0
    } else {
        return a + sumInts(a: a + 1, b: b)
    }
}

2와 5를 인수로 사용합니다.

println(sumInts(a: 2, b: 5))

분명히 대답은 14입니다. 그러나 그 가치가 어떻게 달성되는지 확실하지 않습니다.

다음은 내 두 가지 끊기입니다.

  1. 함수는 조건이 충족 될 때까지 재귀 적으로 호출됩니다. 그 조건은 a> b입니다. 이 조건이 충족되면 0을 반환합니다. 언뜻보기에 반환 값은 분명히 잘못된 0이 될 것으로 예상합니다.

  2. 각 반복에서 ‘a’의 값을 인쇄하면 예상되는 값이 생성됩니다. 2, 3, 4, 5 (첫 번째 조건을 충족하는 5 + 1> b 지점 : a> b)하지만 여전히 그렇지 않습니다. ‘ t 14의 가치가 어떻게 달성되는지보십시오.

내 첫 번째 생각은 다음과 유사한 일이 마술처럼 일어나고 있다는 것입니다.

var answer = a;
answer += a+1 until a > b;
return answer;

그래서 마법을 배제하고, 나는 뭔가를 얻지 못하고 있습니다. 나는 암묵적으로 일어나는 것보다 더 많은 일이 일어나고 있는지 이해하고 싶습니다.

누군가가 이런 종류의 기능 중에 기술적으로 일어나는 일과 결과가 0이 아닌 이유를 친절하게 설명 할 수 있다면, 결국 어떻게 a + sumInts(a: a + 1, b: b) = 14당신의 빚을지게 될 것입니다.



답변

내가 생각하는 혼란은 “동일한 기능”여러 번 호출되는 것처럼 생각에 따른된다. “호출되는 동일한 함수의 많은 복사본”으로 생각하면 더 명확 할 수 있습니다.

함수의 복사본 하나만 0을 반환하고 첫 번째가 아닙니다 (마지막 복사본입니다). 따라서 첫 번째 호출의 결과는 0이 아닙니다.

두 번째 혼란에 대해서는 영어로 재귀 철자를 쓰는 것이 더 쉬울 것이라고 생각합니다. 이 줄을 읽으십시오 :

return a + sumInts(a + 1, b: b)

as “return the value of ‘a’plus (the return value of another copy of the function, which is the copy ‘s value of ‘a’plus (the return value of the other copy ‘s value of ‘ a> b 조건이 충족 될 때까지 함수의 각 복사본이 1 씩 증가한 새 복사본을 생성합니다.

a> b 조건에 도달 할 때까지 실행되는 동안 함수의 복사본의 (잠재적으로 임의의) 긴 스택이 있으며, 모두 다음 복사본의 결과를 기다리고 있습니다. ‘a’에 추가해야합니다.

(편집 : 또한, 내가 언급 한 함수의 복사본 스택이 실제 메모리를 차지하는 실제 것이므로 너무 커지면 프로그램이 중단된다는 점에 유의해야합니다. 컴파일러는이를 최적화 할 수 있습니다. 그러나 스택 공간을 소모하는 것은 많은 언어에서 재귀 함수의 중요하고 불행한 제한입니다.)


답변

1. 조건이 충족 될 때까지 함수가 재귀 적으로 호출됩니다. 그 조건은 a > b입니다. 이 조건이 충족되면 0을 반환합니다. 언뜻보기에 반환 값은 분명히 잘못된 0이 될 것으로 예상합니다.

다음은 컴퓨터 컴퓨팅 sumInts(2,5)이 다음과 같이 생각할 수있는 것입니다.

I want to compute sumInts(2, 5)
for this, I need to compute sumInts(3, 5)
and add 2 to the result.
  I want to compute sumInts(3, 5)
  for this, I need to compute sumInts(4, 5)
  and add 3 to the result.
    I want to compute sumInts(4, 5)
    for this, I need to compute sumInts(5, 5)
    and add 4 to the result.
      I want to compute sumInts(5, 5)
      for this, I need to compute sumInts(6, 5)
      and add 5 to the result.
        I want to compute sumInts(6, 5)
        since 6 > 5, this is zero.
      The computation yielded 0, therefore I shall return 5 = 5 + 0.
    The computation yielded 5, therefore I shall return 9 = 4 + 5.
  The computation yielded 9, therefore I shall return 12 = 3 + 9.
The computation yielded 12, therefore I shall return 14 = 2 + 12.

보시다시피, 함수에 대한 일부 호출은 sumInts실제로 0을 반환하지만 이것은 컴퓨터가 여전히 그 0에 5를 더한 다음 결과에 4를 더한 다음 3, 2를 더해야하기 때문에 최종 값이 아닙니다. 우리 컴퓨터의 생각. 재귀에서 컴퓨터는 재귀 호출을 계산할뿐만 아니라 재귀 호출에서 반환 된 값으로 수행 할 작업을 기억해야합니다. 이러한 종류의 정보가 저장 되는 스택 이라는 컴퓨터 메모리의 특별한 영역이 있습니다 .이 공간은 제한적이며 너무 재귀적인 기능은 스택을 소모 할 수 있습니다. 이것은 가장 사랑받는 웹 사이트에 이름을 부여 하는 스택 오버플로 입니다.

귀하의 진술은 컴퓨터가 재귀 호출을 할 때 있었던 것을 잊었다는 암시적인 가정을하는 것 같지만 그렇지 않습니다. 이것이 귀하의 결론이 귀하의 관찰과 일치하지 않는 이유입니다.

2. 각 반복에서 ‘a’의 값을 인쇄하면 예상되는 값이 생성됩니다. 2, 3, 4, 5 (첫 번째 조건을 충족하는 5 + 1> b 지점 : a> b)하지만 여전히 14의 가치가 어떻게 달성되는지 보지 마십시오.

이는 반환 값이 a자체가 아니라 a재귀 호출에 의해 반환 된 값과 값의 합계 이기 때문 입니다.


답변

재귀를 이해하려면 문제를 다른 방식으로 생각해야합니다. 전체적으로 의미가있는 대규모 논리적 단계 순서 대신에 큰 문제를 가져 와서 작은 문제로 나누어 해결 한 후 하위 문제에 대한 답을 얻은 후 하위 문제의 결과를 결합하여 더 큰 문제에 대한 해결책. 당신과 당신의 친구들이 거대한 양동이에있는 구슬의 수를 세어야한다고 생각하세요. 당신은 각각 더 작은 양동이를 가져 와서 그것들을 개별적으로 세고, 당신이 끝났을 때 당신은 총계를 더합니다. 이제 여러분 각자가 친구를 찾아서 양동이를 더 나눈다면, 당신은 다른 친구들이 할 때까지 기다려야합니다. 총계를 알아 내서 여러분 각자에게 다시 가져 와서 합산하세요. 등등.

함수가 자신을 재귀 적으로 호출 할 때마다 문제의 하위 집합이 포함 된 새 컨텍스트를 만들고 해당 부분이 해결되면 이전 반복이 완료 될 수 있도록 반환된다는 점을 기억해야합니다.

단계를 보여 드리겠습니다.

sumInts(a: 2, b: 5) will return: 2 + sumInts(a: 3, b: 5)
sumInts(a: 3, b: 5) will return: 3 + sumInts(a: 4, b: 5)
sumInts(a: 4, b: 5) will return: 4 + sumInts(a: 5, b: 5)
sumInts(a: 5, b: 5) will return: 5 + sumInts(a: 6, b: 5)
sumInts(a: 6, b: 5) will return: 0

sumInts (a : 6, b : 5)가 실행되면 결과를 계산할 수 있으므로 얻은 결과로 체인을 다시 올라갑니다.

 sumInts(a: 6, b: 5) = 0
 sumInts(a: 5, b: 5) = 5 + 0 = 5
 sumInts(a: 4, b: 5) = 4 + 5 = 9
 sumInts(a: 3, b: 5) = 3 + 9 = 12
 sumInts(a: 2, b: 5) = 2 + 12 = 14.

재귀 구조를 나타내는 또 다른 방법 :

 sumInts(a: 2, b: 5) = 2 + sumInts(a: 3, b: 5)
 sumInts(a: 2, b: 5) = 2 + 3 + sumInts(a: 4, b: 5)
 sumInts(a: 2, b: 5) = 2 + 3 + 4 + sumInts(a: 5, b: 5)
 sumInts(a: 2, b: 5) = 2 + 3 + 4 + 5 + sumInts(a: 6, b: 5)
 sumInts(a: 2, b: 5) = 2 + 3 + 4 + 5 + 0
 sumInts(a: 2, b: 5) = 14


답변

재귀는 이해하기 까다로운 주제이며 여기서 완전히 정의 할 수 없다고 생각합니다. 대신 여기에있는 특정 코드에 초점을 맞추고 솔루션이 작동하는 이유에 대한 직관과 코드가 결과를 계산하는 방법에 대한 메커니즘을 모두 설명하려고 노력할 것입니다.

여기에 제공 한 코드는 다음 문제를 해결합니다. a에서 b까지의 모든 정수의 합계를 알고 싶습니다. 예를 들어, 2에서 5까지의 숫자 합계를 원합니다.

2 + 3 + 4 + 5

문제를 재귀 적으로 해결하려고 할 때 첫 번째 단계 중 하나는 문제를 동일한 구조의 작은 문제로 나누는 방법을 파악하는 것입니다. 따라서 2에서 5까지의 숫자를 더하고 싶다고 가정 해 보겠습니다. 이를 단순화하는 한 가지 방법은 위의 합계가 다음과 같이 다시 작성 될 수 있음을 확인하는 것입니다.

2 + (3 + 4 + 5)

여기에서 (3 + 4 + 5)는 3과 5 사이의 모든 정수의 합입니다. 즉, 2에서 5 사이의 모든 정수의 합을 알고 싶다면 3에서 5 사이의 모든 정수의 합을 계산하여 시작한 다음 2를 더합니다.

그렇다면 3과 5 사이의 모든 정수의 합을 어떻게 계산합니까? 음, 그 합계는

3 + 4 + 5

대신 다음과 같이 생각할 수 있습니다.

3 + (4 + 5)

여기에서 (4 + 5)는 4와 5 사이의 모든 정수의 합입니다. 따라서 3에서 5 사이의 모든 숫자의 합계를 계산하려면 4에서 5 사이의 모든 정수의 합계를 계산 한 다음 3을 더합니다.

여기에 패턴이 있습니다! a와 b (포함) 사이의 정수 합계를 계산하려면 다음을 수행 할 수 있습니다. 먼저 a + 1과 b (포함) 사이의 정수 합계를 계산합니다. 다음으로 해당 합계에를 추가합니다. “a + 1과 b 사이의 정수의 합을 계산하라”는 것은 우리가 이미 풀려고하는 문제와 거의 비슷하지만 매개 변수가 약간 다르다는 것을 알게 될 것입니다. a에서 b로 계산하는 대신 a + 1에서 b로 계산합니다. 이것이 재귀 적 단계입니다. 더 큰 문제 ( “a에서 b 로의 합, 포함”)를 해결하기 위해 문제를 더 작은 버전 ( “a + 1에서 b 로의 합, 포함”)으로 줄입니다.

위에있는 코드를 살펴보면 다음 단계가 있음을 알 수 있습니다.

return a + sumInts(a + 1, b: b)

이 코드는 위의 논리를 간단히 번역 한 것입니다. a에서 b까지 합산하려면 a + 1에서 b까지 합산하여 시작합니다 (즉, s에 대한 재귀 호출 sumInt) a.

물론이 접근 방식 자체는 실제로 작동하지 않습니다. 예를 들어, 5에서 5까지의 모든 정수의 합을 어떻게 계산할까요? 음, 현재 논리를 사용하여 6과 5 사이의 모든 정수의 합을 계산 한 다음 5를 더합니다. 그러면 6과 5 사이의 모든 정수의 합을 어떻게 계산합니까? 글쎄, 우리의 현재 논리를 사용하여 7과 5 사이의 모든 정수의 합을 계산하고 6을 더할 것입니다. 여기에 문제가 있음을 알 수 있습니다-이것은 계속 진행됩니다!

재귀 문제 해결에서는 문제 단순화를 중단하고 대신 직접 해결하는 방법이 있어야합니다. 일반적으로 답을 즉시 결정할 수있는 간단한 사례를 찾은 다음 간단한 사례가 발생할 때 직접 해결하도록 솔루션을 구성합니다. 이를 일반적으로 기본 사례 또는 재귀 적 기반 이라고 합니다 .

그렇다면이 특정 문제의 기본 사례는 무엇입니까? a에서 b까지의 정수를 합산 할 때 a가 b보다 크면 답은 0입니다. 범위에 숫자가 없습니다! 따라서 솔루션을 다음과 같이 구성합니다.

  1. a> b이면 답은 0입니다.
  2. 그렇지 않으면 (a ≤ b) 다음과 같이 답을 얻으십시오.
    1. a + 1과 b 사이의 정수 합계를 계산합니다.
    2. 대답을 얻으려면를 추가하십시오.

이제이 의사 코드를 실제 코드와 비교하십시오.

func sumInts(a: Int, b: Int) -> Int {
    if (a > b) {
        return 0
    } else {
        return a + sumInts(a + 1, b: b)
    }
}

의사 코드로 설명 된 솔루션과이 실제 코드 사이에는 거의 정확히 일대일 맵이 있습니다. 첫 번째 단계는 기본 케이스입니다. 빈 숫자 범위의 합계를 요청하면 0이됩니다. 그렇지 않으면 a + 1과 b 사이의 합계를 계산 한 다음 a를 더합니다.

지금까지 코드에 대한 높은 수준의 아이디어를 제공했습니다. 하지만 두 가지 다른 아주 좋은 질문이있었습니다. 첫째, 함수가 a> b이면 0을 반환한다고하는데 왜 항상 0을 반환하지 않습니까? 둘째, 14는 실제로 어디에서 왔습니까? 차례대로 살펴 보겠습니다.

아주 아주 간단한 경우를 시도해 봅시다. 전화하면 sumInts(6, 5)어떻게 되나요? 이 경우 코드를 살펴보면 함수가 0을 반환하는 것을 알 수 있습니다. 그게 옳은 일입니다. 범위에 숫자가 없습니다. 이제 더 열심히 시도하십시오. 전화하면 sumInts(5, 5)어떻게 되나요? 음, 다음과 같은 일이 발생합니다.

  1. 전화 sumInts(5, 5)하세요. 우리 else는 ‘a + sumInts (6, 5)’의 값을 반환 하는 분기에 들어갑니다.
  2. sumInts(5, 5)무엇인지 확인 하려면 현재 sumInts(6, 5)수행중인 작업을 일시 중지하고을 호출해야 sumInts(6, 5)합니다.
  3. sumInts(6, 5)호출됩니다. if분기에 들어가서를 반환합니다 0. 그러나이 인스턴스는 sumInts에서 호출 sumInts(5, 5)되었으므로 반환 값은 sumInts(5, 5)최상위 호출자가 아닌로 다시 전달됩니다 .
  4. sumInts(5, 5)이제 5 + sumInts(6, 5)다시 계산할 수 있습니다 5. 그런 다음 최상위 호출자에게 반환합니다.

여기서 값 5가 어떻게 형성되었는지 확인하십시오. 에 대한 한 번의 활성 통화로 시작했습니다 sumInts. 이로 인해 또 다른 재귀 호출이 시작되었고 해당 호출에서 반환 된 값은 정보를 sumInts(5, 5). sumInts(5, 5)그런 다음에 대한 호출 은 계산을 수행하고 호출자에게 값을 반환했습니다.

을 사용하여 시도하면 다음과 같은 sumInts(4, 5)결과가 발생합니다.

  • sumInts(4, 5)반환을 시도합니다 4 + sumInts(5, 5). 이를 위해sumInts(5, 5) .
    • sumInts(5, 5)반환을 시도합니다 5 + sumInts(6, 5). 이를 위해sumInts(6, 5) .
    • sumInts(6, 5)sumInts(5, 5).</li>
      <li>
      sumInts (5, 5) now has a value forsumInts (6, 5) , namely 0. It then returns5 + 0 = 5` 로 0을 반환합니다 .
  • sumInts(4, 5)이제에 대한 값 sumInts(5, 5), 즉 5가 4 + 5 = 9있습니다. 그런 다음을 반환합니다 .

즉, 반환되는 값은 한 번에 하나씩 값을 합산하여 구성되며, 매번 특정 재귀 호출에 의해 반환 된 값 하나 sumIntsa. 재귀가 바닥에 도달하면 가장 깊은 호출은 0을 반환합니다. 그러나이 값은 재귀 호출 체인을 즉시 종료하지 않습니다. 대신, 그 값을 한 계층 위의 재귀 호출에 다시 전달합니다. 그런 식으로 각 재귀 호출은 하나의 숫자를 더 추가하고 체인에서 더 높은 값을 반환하여 전체 합산으로 절정에 이릅니다. 연습으로 이것을 추적 해보십시오.sumInts(2, 5) 으로 시작하고 싶은을 .

도움이 되었기를 바랍니다!


답변

지금까지 여기에 좋은 답변이 있지만 다른 방법을 사용하는 답변을 하나 더 추가하겠습니다.

먼저, 흥미로울 수있는 간단한 재귀 알고리즘에 대한 많은 기사를 작성했습니다. 보다

http://ericlippert.com/tag/recursion/

http://blogs.msdn.com/b/ericlippert/archive/tags/recursion/

그것들은 최신 순서로되어 있으므로 아래에서 시작하십시오.

둘째, 지금까지 모든 답변은 함수 활성화 를 고려하여 재귀 적 의미를 설명했습니다 . 각각의 호출은 새로운 활성화 를 만들고 재귀 호출은이 활성화의 컨텍스트에서 실행됩니다. 그것은 그것을 생각하는 좋은 방법이지만, 또 다른 동등한 방법이 있습니다 : 스마트 텍스트 찾기 및 바꾸기 .

함수를 좀 더 간결한 형식으로 다시 작성하겠습니다. 이것을 특정 언어로 생각하지 마십시오.

s = (a, b) => a > b ? 0 : a + s(a + 1, b)

그게 말이 되길 바랍니다. 조건부 연산자에 익숙하지 않은 경우 형식 condition ? consequence : alternative이며 그 의미가 명확 해집니다.

이제 우리는 평가하고자하는 s(2,5) 함수 본문이있는 통화의 대체 텍스트를 수행하여 우리는 그렇게, 다음 교체 a2b함께 5:

s(2, 5)
---> 2 > 5 ? 0 : 2 + s(2 + 1, 5)

이제 조건부를 평가하십시오. 텍스트 2 > 5false.

---> false ? 0 : 2 + s(2 + 1, 5)

이제 모든 거짓 조건을 대안으로 텍스트로 바꾸고 모든 참 조건을 결과로 바꿉니다. 거짓 조건부 만 있으므로 해당 표현식을 대안으로 텍스트로 대체합니다.

---> 2 + s(2 + 1, 5)

이제 모든 +기호 를 입력하지 않아도되도록 상수 산술을 해당 값으로 텍스트로 대체합니다. (이것은 약간의 속임수이지만 모든 괄호를 추적하고 싶지는 않습니다!)

---> 2 + s(3, 5)

이제 검색 및 바꾸기, 이번에는 호출의 본문, 3for a5for b. 호출에 대한 대체를 괄호 안에 넣습니다.

---> 2 + (3 > 5 ? 0 : 3 + s(3 + 1, 5))

이제 우리는 동일한 텍스트 대체 단계를 계속 수행합니다.

---> 2 + (false ? 0 : 3 + s(3 + 1, 5))
---> 2 + (3 + s(3 + 1, 5))
---> 2 + (3 + s(4, 5))
---> 2 + (3 + (4 > 5 ? 0 : 4 + s(4 + 1, 5)))
---> 2 + (3 + (false ? 0 : 4 + s(4 + 1, 5)))
---> 2 + (3 + (4 + s(4 + 1, 5)))
---> 2 + (3 + (4 + s(5, 5)))
---> 2 + (3 + (4 + (5 > 5 ? 0 : 5 + s(5 + 1, 5))))
---> 2 + (3 + (4 + (false ? 0 : 5 + s(5 + 1, 5))))
---> 2 + (3 + (4 + (5 + s(5 + 1, 5))))
---> 2 + (3 + (4 + (5 + s(6, 5))))
---> 2 + (3 + (4 + (5 + (6 > 5 ? 0 : s(6 + 1, 5)))))
---> 2 + (3 + (4 + (5 + (true ? 0 : s(6 + 1, 5)))))
---> 2 + (3 + (4 + (5 + 0)))
---> 2 + (3 + (4 + 5))
---> 2 + (3 + 9)
---> 2 + 12
---> 14

여기서 우리가 한 모든 것은 단순한 텍스트 대체 였습니다. 정말로 나는 “2 + 1″을 “3”으로 대체하지 말았어야했는데, 그렇게해야 할 때까지 계속해서 그렇게해야했지만, 교육적으로는 읽기가 어려워 졌을 것입니다.

함수 활성화는 함수 호출을 호출 본문으로 대체하고 형식 매개 변수를 해당 인수로 대체하는 것입니다. 괄호를 지능적으로 도입하는 데주의해야하지만 그 외에는 텍스트 교체 일뿐입니다.

물론 대부분의 언어는 실제로 활성화를 텍스트 대체로 구현 하지 않지만 논리적으로 그게 다입니다.

그렇다면 무한 재귀는 무엇입니까? 텍스트 대체가 멈추지 않는 재귀! 결국 우리가 더 이상 s대체 할 것이없는 단계에 도달 한 다음 산술에 대한 규칙을 적용 할 수 있음을 주목 하십시오.


답변

일반적으로 재귀 함수가 어떻게 작동하는지 알아내는 방법은 기본 케이스를보고 거꾸로 작업하는 것입니다. 이 기능에 적용된 기술은 다음과 같습니다.

먼저 기본 케이스 :

sumInts(6, 5) = 0

그런 다음 호출 스택 에서 바로 위에있는 호출 :

sumInts(5, 5) == 5 + sumInts(6, 5)
sumInts(5, 5) == 5 + 0
sumInts(5, 5) == 5

그런 다음 호출 스택에서 바로 위에있는 호출 :

sumInts(4, 5) == 4 + sumInts(5, 5)
sumInts(4, 5) == 4 + 5
sumInts(4, 5) == 9

등등:

sumInts(3, 5) == 3 + sumInts(4, 5)
sumInts(3, 5) == 3 + 9
sumInts(3, 5) == 12

등등:

sumInts(2, 5) == 2 + sumInts(3, 5)
sumInts(4, 5) == 2 + 12
sumInts(4, 5) == 14

통지 우리가 함수에 우리의 원래 통화에 도착했습니다 sumInts(2, 5) == 14

이러한 호출이 실행되는 순서 :

sumInts(2, 5)
sumInts(3, 5)
sumInts(4, 5)
sumInts(5, 5)
sumInts(6, 5)

이러한 호출이 반환되는 순서 :

sumInts(6, 5)
sumInts(5, 5)
sumInts(4, 5)
sumInts(3, 5)
sumInts(2, 5)

반환 되는 순서대로 호출을 추적하여 함수가 작동하는 방식에 대한 결론에 도달했습니다 .


답변

나는 그것을 줄 것이다.

방정식 a + sumInts (a + 1, b)를 실행하면 최종 답이 어떻게 14인지 보여 드리겠습니다.

//the sumInts function definition
func sumInts(a: Int, b: Int) -> Int {
    if (a > b) {
        return 0
    } else {
        return a + sumInts(a + 1, b)
    }
}

Given: a = 2 and b = 5

1) 2 + sumInts(2+1, 5)

2) sumInts(3, 5) = 12
   i) 3 + sumInts(3+1, 5)
   ii) 4 + sumInts(4+1, 5)
   iii) 5 + sumInts(5+1, 5)
   iv) return 0
   v) return 5 + 0
   vi) return 4 + 5
   vii) return 3 + 9

3) 2 + 12 = 14.

추가 질문이 있으면 알려주십시오.

다음은 재귀 함수의 또 다른 예입니다.

한 남자가 방금 대학을 졸업했습니다.

t는 년 단위의 시간입니다.

은퇴하기 전에 총 실제 근무 연수는 다음과 같이 계산할 수 있습니다.

public class DoIReallyWantToKnow
{
    public int howLongDoIHaveToWork(int currentAge)
    {
      const int DESIRED_RETIREMENT_AGE = 65;
      double collectedMoney = 0.00; //remember, you just graduated college
      double neededMoneyToRetire = 1000000.00

      t = 0;
      return work(t+1);
    }

    public int work(int time)
    {
      collectedMoney = getCollectedMoney();

      if(currentAge >= DESIRED_RETIREMENT_AGE
          && collectedMoney == neededMoneyToRetire
      {
        return time;
      }

      return work(time + 1);
    }
}

그리고 그것은 누군가를 우울하게하기에 충분할 것입니다. ;-피