• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    해결됨

sumArray()재귀함수 이해가 안됩니다!

23.07.10 21:01 작성 조회수 224

1

sumArray 함수에서
return 값인
sumArray(arr.slice(0, -1)) + arr[arr.length - 1] 구문이 이해가 잘 안되는데

arr.slice(0, -1) 은 [1, 2, 3, 4]이고
arr[arr.length - 1]은 5인데

[1, 2, 3, 4] + 5 값으로는 1, 2, 3, 4, 55 나와야 되는게 아닌가요??

어째서 sumArray([1, 2, 3, 4])를 줬다고 해서
1 + 2 + 3 + 4 가 되는 지 모르겠습니다.

만약 그렇게 되려면 아래 같은 로직이라고 있어야되는거 아닌가요??

let plus = 0;
arr.forEach(el => {
  plus += el
});

도저히 이해가 안되네요 도와주시면 감사하겠습니다!!

답변 2

·

답변을 작성해보세요.

1

안녕하세요 락토님!
재귀가 많이 어렵죠?
질문하신 내용에 대해서 답변드리겠습니다.

아래 코드가 왜 1 + 2+ 3+ 4 + 5가 되는지 질문을 주셨는데요.
값이 조금 많아서 arr에 [1,2,3]이 들었다고 가정하고 설명드리겠습니다.

return sumArray(arr.slice(0, -1)) + arr[arr.length - 1]

위코드에서 arr에 [1, 2, 3]가 들어있다고 가정하고 값을 치환해보겠습니다.
그럼 아래처럼 표현할 수 있습니다.

return sumArray([1,2]) + 3;

여기서 sumArray의 인자로 넘겨진 배열은 1 + 2가 아닙니다.
배열일 뿐이죠!
지금 우리가 알 수 있는 것은 sumArray([1,2])의 결과에 3를 더한 다는 것만 알 수 있습니다.

근데 sumArray라는 함수가 호출되었기 때문에 [1,2]라는 인자를 받는 함수를 실행하게 됩니다.
(중요한 건 아직 sumArray([1,2]) + 3를 호출한 함수가 종료되지 않았다는 것입니다.)
그럼 아래 코드처럼 표현할 수 있습니다.

return sumArray([1]) + 2

이 상황에서 우리가 알 수 있는 것은 sumArray([1])의 결과는 몰라도 이 결과에 2를 더한 다는 것입니다.
여기서 마찬가지로 [1]이라는 인자를 받는 함수가 새로 실행하게 됩니다.
(중요한건 아직 sumArray([1]) + 2를 호출한 함수가 종료되지 않았다는 것입니다.)
그럼 아래 코드처럼 표현할 수 있습니다.

function sumArray(arr){ // arr = [1]
    if(arr.length == 1) rteurn arr[0];
    ...
}

그럼 배열의 길이가 1이기 때문에 1을 리턴하며 함수를 종료합니다.

이렇게 함수가 종료되면 끝일까요?
그렇지 않습니다.
바로 이 함수를 호출했던 함수로 리턴하게 됩니다.
그 함수는 바로 아래 보이는 함수죠.

return sumArray([1]) + 2

여기서 sumArray([1])의 결과는 1로 리턴되었으므로 이 값을 치환하면 아래와 같이 표현할 수 있습니다.

// return sumArray([1]) + 2 치환 전
return 1 + 2 // 치환 후

그럼 1+2의 결과인 3을 리턴하며 함수를 종료합니다.
하지만 이렇게 함수가 종료되면 끝일까요?
그렇지 않습니다.
바로 이 함수를 호출했던 함수로 리턴하게 됩니다.
이렇게 말이죠.

return sumArray([1, 2]) + 3

여기서 sumArray([1,2])의 결과는 3으로 리턴되었으므로 이 값을 치환하면 아래와 같이 표현할 수 있습니다.

// return sumArray([1,2]) + 3 치환 전
return 3 + 3 // 치환 후

그럼 3+3결과인 6을 리턴하며 함수를 종료합니다.
이 함수를 호출한 다른 함수는 없으므로 sum 함수에 결과를 출력하게 되는 것입니다.

락토님께서 질문하신 것처럼 sumArray([1,2,3,4])를 줬다고해서 1+2+3+4가 되는 것이 아니라
sumArray(arr.slice(0, -1)) + arr[arr.length - 1] 이 코드에서 더하기가 있으므로 더하기가 진행되는 것입니다.

예시는 [1,2,3,4,5] 배열로 진행했지만 더 쉬운 이해를 위해서 [1], [1,2] 배열을 넣어가면서 천천히 따라가보시면 이해가 조금씩 되실겁니다.

말씀해주신 forEach로 작성하신 코드로 말씀드리자면 결과는 같지만 접근 방식은 완전 다른 방식입니다.
이렇게 간단한 덧셈의 경우 락토님이 말씀하신 코드가 더 효율적이지만(더 적은 스택사용과 함수 호출) 하향식 접근으로 문제를 훨씬 쉽게 해결할 수 있는 경우가 있거든요!

궁금증이 해결되셨나요?
어려우신 점이 있으시면 대댓글 부탁드립니다 :)

0

락토님의 프로필

락토

질문자

2023.07.11

와 정말 헷갈리네요 재귀함수
자세히 설명해주셔서 이해했습니다!
다시 천천히 뜯어봐야겠네요 감사합니다!