inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Học cấu trúc dữ liệu và thuật toán dễ dàng qua hình ảnh (Phần cơ bản)

Tư duy đệ quy

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

Đã giải quyết

412

wsckm18081

1 câu hỏi đã được viết

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
});

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

알고리즘 재귀함수 재귀

Câu trả lời 2

1

gamja5

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

아래 코드가 왜 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

wsckm18081

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

연결리스트 삽입삭제 O(1) 아닌가요?

0

52

2

큐의 마지막 데이터가 head에 위치해야 하는 이유가 궁금합니다.

0

97

2

이중연결 리스트 데이터 삭제시 질문이 있습니다.

1

87

2

자바스크립트 배열은 동적이 아닌가요?

1

111

2

자바스크립트 배열

0

108

2

코테에서 링크리스트 자료구조를 사용해야 하면, 이번 강의에서 구현한 메서드들도 모두 직접 구현하면 되나요?/

0

177

2

공부 방식 질문 드립니다.

1

143

2

메모이제이션과 타뷸레이션 관련해서 질문드립니다.

1

193

2

병합정렬에서 질문이 있습니다.

2

157

1

병합정렬 질문 있습니다.

1

174

5

데이터 삽입, 삭제 함수 오류 범위 설정

0

180

2

해시 테이블에서 질문이 잇습니다.

2

144

2

시간복잡도 계산 시 1회 연산당 연산량은 왜 고려하지 않는 건가요?

1

180

2

터미널 설정

0

120

2

2:13분 관련 질문입니다

0

99

1

8:47초경부터 9:00초까지 질문입니다.

1

149

2

tail을 삭제하는 경우에 관련해서 질문이 있습니다.

0

129

1

2:36초 head 위치가?

1

129

2

환경구축강의 중 터미널 파일 실행오류

0

189

2

4:58 이중for문 질문있습니다.

0

116

1

hanoi함수 처음 호출에 대해서 여쭤봅니다.

1

146

2

해쉬테이블 데이터 관련해서 질문있습니다.

0

170

2

자바스크립트 Map과 어떤 차이가 있나요??

0

225

2

질문이있습니다.

0

116

1