Skip to content

Commit a4a318b

Browse files
재귀 과제(피보나치 수열) 보완
1 parent e506358 commit a4a318b

File tree

2 files changed

+14
-14
lines changed

2 files changed

+14
-14
lines changed

1-js/06-advanced-functions/01-recursion/03-fibonacci-numbers/solution.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
가장 먼저 떠올릴 수 있는 방법은 재귀를 사용하는 것입니다.
1+
가장 먼저 떠오르는 방법은 재귀입니다.
22

3-
정의에서도 알 수 있듯이 피보나치 수열은 재귀를 사용해 구현할 수 있습니다.
3+
정의 자체에서 유추할 수 있듯이 피보나치 수열은 재귀를 사용해 구현할 수 있습니다.
44

55
```js run
66
function fib(n) {
@@ -9,14 +9,14 @@ function fib(n) {
99

1010
alert( fib(3) ); // 2
1111
alert( fib(7) ); // 13
12-
// fib(77); // will be extremely slow!
12+
// fib(77); // 연산에 너무 많은 시간이 걸립니다!
1313
```
1414

15-
그런데 이렇게 구현하면 `n` 경우 속도가 느려집니다. `fib(77)` 호출하면 CPU 리소스를 다 잡아먹어서 잠시 엔진이 멈출 수 있습니다.
15+
그런데 이렇게 재귀를 사용해 구현하면 `n`커질 경우 속도가 느려집니다. `fib(77)` 호출하면 CPU 리소스를 다 잡아먹어서 잠시 엔진이 멈출 수도 있.
1616

17-
이는 함수 호출 도중에 수많은 서브 호출이 일어나기 때문입니다. 같은 값들이 여러 번 평가되면서 이런 일이 발생하죠.
17+
연산 속도가 느려지는 이유는 함수 호출 도중에 수많은 서브 호출이 일어나기 때문입니다. 같은 값들이 여러 번 평가되면서 이런 일이 발생하죠.
1818

19-
`fib(5)`의 계산 과정을 살펴보며 자세히 알아봅시다.
19+
`fib(5)`의 계산 과정을 살펴봅시다.
2020

2121
```js no-beautify
2222
...
@@ -31,13 +31,13 @@ fib(4) = fib(3) + fib(2)
3131

3232
![fibonacci recursion tree](fibonacci-recursion-tree.svg)
3333

34-
그림을 보니 `fib(3)`은 두 번 평가된다는 것이 좀 더 명확히 보이네요. `fib(2)`는 세 번이나 평가되기까지 합니다. `n`이 증가하는 속도보다 전체 연산 횟수가 더 빨리 증가한다는 것을 아실 수 있겠죠? `77`그리 큰 숫자가 아니지만 `n=77`경우 엄청난 수의 연산이 일어난다는 것을 알 수 있습니다.
34+
그림을 보니 `fib(3)`은 두 번 평가된다는 것이 좀 더 명확히 보이네요. `fib(2)`는 세 번이나 평가됩니다. 이렇게 재귀를 사용해 피보나치 수열을 구현하면 `n`이 증가하는 속도보다 전체 연산 횟수가 더 빨리 증가합니다. `77` 자체는 그리 큰 숫자가 아니지만, 피보나치 수열에서 `n=77`경우엔 엄청난 수의 연산이 일어나죠.
3535

36-
이런 단점을 극복하기 위해 이미 평가된 값을 어딘가에 저장해놓는 식으로 최적화를 할 수 있습니다. `fib(3)` 계산이 끝나면 이 결과를 어딘가에 저장해 놓았다가 같은 값이 필요할 때 저장된 값을 불러오는 식으로 말이죠.
36+
이런 단점은 이미 평가된 값을 어딘가에 저장해놓는 식으로 최적화 할 수 있습니다. `fib(3)` 계산이 끝나면 이 결과를 어딘가에 저장해 놓았다가 같은 값이 필요할 때 저장된 값을 불러오는 식으로 말이죠.
3737

38-
또 다른 방법으론 재귀가 아닌 반복문을 기반으로 하는 알고리즘을 짜는 것입니다.
38+
또 다른 최적화 방법은 재귀가 아닌 반복문을 기반으로 하는 알고리즘을 짜는 것입니다.
3939

40-
`n`부터 시작해 숫자를 하나씩 줄이며 원하는 값을 구하는 대신 `1``2`로 시작하는 반복문으로 `fib(3)`을 구하고, 이를 기반으로 `fib(4)`를 구하고, 또 이를 기반으로 `fib(5)`를 구하는 식으로 알고리즘을 구현할 수 있을 겁니다. 이렇게 알고리즘을 구현하면 이전 두 항의 값만 저장하면 되죠.
40+
`n`부터 시작해 숫자를 하나씩 줄이며 원하는 값을 구하는 대신 `1``2`로 시작하는 반복문으로 `fib(3)`을 구하고, 이를 기반으로 `fib(4)`를 구하고, 또 이를 기반으로 `fib(5)`를 구하는 식으로 알고리즘을 구현할 수 있습니다. 이렇게 구현하면 이전 두 항의 값만 저장하면 되죠.
4141

4242
반복문을 기반으로 하는 알고리즘을 좀 더 자세히 살펴보겠습니다.
4343

@@ -107,4 +107,4 @@ alert( fib(77) ); // 5527939700884757
107107

108108
반복문 내 `i``3`부터 시작합니다. 피보나치 수열의 첫 번째 항과 두 번째 항은 `a=1`, `b=1`로 하드코딩 했기 때문입니다.
109109

110-
이런 접근 방법은 [동적 계획법(dynamic programming)](https://en.wikipedia.org/wiki/Dynamic_programming)이라 부릅니다.
110+
이런 접근 방법은 [bottom-up 다이내믹 프로그래밍(dynamic programming, 동적 계획법)](https://en.wikipedia.org/wiki/Dynamic_programming)이라 부릅니다.

1-js/06-advanced-functions/01-recursion/03-fibonacci-numbers/task.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ importance: 5
33
---
44
# 피보나치 수 계산하기
55

6-
[피보나치 수](https://ko.wikipedia.org/wiki/%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98_%EC%88%98)첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열로, <code>F<sub>n</sub> = F<sub>n-1</sub> + F<sub>n-2</sub></code>이라는 공식으로 표현됩니다.
6+
[피보나치 수](https://ko.wikipedia.org/wiki/%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98_%EC%88%98)첫째와 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열로, <code>F<sub>n</sub> = F<sub>n-1</sub> + F<sub>n-2</sub></code>라는 공식으로 표현할 수 있습니다.
77

8-
수열의 처음 두 숫자는 `1`이고, 그 다음 항들은 `2(1+1)`,`3(1+2)`,`5(2+3)`가 됩니다(`1, 1, 2, 3, 5 , 8, 13, 21 ...`).
8+
처음 두 항은 `1`이고, 그다음 항들은 `2(1+1)`,`3(1+2)`,`5(2+3)`이므로 전체 수열은 `1, 1, 2, 3, 5 , 8, 13, 21 ...` 형태를 띱니다.
99

1010
피보나치 수는 [황금 비율](https://en.wikipedia.org/wiki/Golden_ratio) 등 우리 주변을 둘러싼 수많은 자연 현상과 관련이 있습니다.
1111

@@ -21,4 +21,4 @@ alert(fib(7)); // 13
2121
alert(fib(77)); // 5527939700884757
2222
```
2323

24-
참고: `fib (77)`호출하면 연산 시간이 1초도 걸리지 않게 빨라야 합니다.
24+
주의: `fib (77)`호출했을 때 연산 시간이 1초 이상 되면 안 됩니다.

0 commit comments

Comments
 (0)