Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[1주차] 재귀, 꼬리 재귀, 꼬리 재귀 최적화 #14

Open
wants to merge 8 commits into
base: main
Choose a base branch
from

Conversation

whoodongpyo
Copy link

아직 재귀적 사고에 익숙하지 않아서
문제를 풀면서 강의도 계속 반복해서 보고 있습니다.

풀이한 만큼이라도 먼저 제출하고 계속 진행하겠습니다...!

}

// 2) 재귀 함수 호출로 값을 변경하는 대신에 변수의 값을 할당해서 변경한다.
acc = acc + current.pop();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

주어진 배열의 마지막을 하나씩 제거하면서 값을 더해주고 있군요. 여기서 pop메서드는 배열의 가장 끝에 있는 요소를 제거하는 것으로 배열 자체를 변경하게 됩니다. 그리고 제일 뒤에 있는 것을 제거하기 때문에 만약 지금처럼 값을 더하는 것이 아니라 이어 붙이는 작업이었다면 순서가 달라질 수 있겠죠.

pop으로 배열 자체를 수정한다면 numbers를 참조하는 곳에서도 변경이 일어납니다. 그러면 의도치 않은 변경때문에 심각한 버그가 발생할 수 있습니다. 그래서 만약 하나를 제거하고 나머지 배열을 넘기고 싶다면 slice메서드를 사용할 수 있습니다. slice메서드는 원본 배열을 건드리지 않고 복사합니다.

acc = acc + current.slice(1);

혹은 이렇게도 할 수 있습니다.

const [first, ...newArray] = [1, 2, 3, 4, 5];
// first = 1
// newArray = [2, 3, 4, 5]

그런데 이렇게 값들을 복사하는 것은 효율적이지는 않습니다. 그래서 성능을 최적화하기 위해서는 배열을 복사하는 대신 index를 사용할 수 있습니다. index의 값을 변경하는 것은 데이터의 크기이 비례하지 않기 때문입니다.

const solution = (numbers, index = 0) => {
  let acc = 0;

  while (true) {
    if (index === numbers.length) {
      return acc;
    }

    acc = acc + numbers[index];
    index++;
  }
}

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

가장 익숙한 방법인 for loop 으로 해결할 땐 당연하게(?) index 를 사용했는데
정작 꼬리 재귀 최적화에서는 index 를 떠올리지 못한 게 아쉽네요 😭

코멘트 해주신대로, 데이터 원본을 직접적으로 수정하지 않도록 습관화해야겠습니다!

- 배열을 직접 수정하는 대신 index 사용하기
- ESLint 경고 해결 : while(true) 와 같은 상수 조건을 사용하는 것을 방지
- ESLint 경고 해결 : while (true) 와 같은 상수 조건 사용 방지
- 변수명을 의미있는 이름으로 변경.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants