재귀 마스터하기
6276 단어 codenewbiecareerjavascript
해결책
이 솔루션에는 재귀가 포함됩니다! 보다 "동적 프로그래밍"접근 방식으로 문제를 해결한 경우 아래에 해결 방법을 설명하십시오.
알고리즘 문제를 해결하는 데 도움이 되는 것은 잠시 멈추고 내 두뇌가 이 문제를 어떻게 해결할지 생각하는 것입니다. 특정 액면가의 동전으로 일정 금액을 거스름돈으로 바꾸는 방법을 세어야 한다면 어떻게 될까요?
1센트와 2센트의 가치가 있는 동전으로 5센트를 벌어야 한다고 가정해 봅시다. 나는 아마도 2센트 동전 하나를 가지고 시작하여 내가 원하는 총 5센트에서 2센트를 빼고 나머지 3센트로 작업할 것입니다. 2센트짜리 동전을 하나 더 가져와 나머지 3센트에서 빼면 내가 원하는 5센트를 만드는 데 필요한 1센트가 남습니다. 이 경우 1센트. 그렇게 하면 5센트가 되고 2센트와 1센트로 5센트를 만드는 한 가지 방법입니다. 그리고 나는 모든 방법을 찾을 때까지 그렇게 동전 목록을 계속 내려갈 것입니다. 코드로 변환하는 방법? 음, 내 총 남은 센트가 0일 때 방법을 찾은 것 같죠? 그것은 기본 사례처럼 들립니다. 그리고 우리가 원하는 총계를 마이너스 영역으로 넘어가면 그것은 방법이 아닙니다. 그것은 또한 기본 사례처럼 들립니다.
// see if you can spot the bug before I complete this function below!
function coins (amount) {
const coinsArr = [ 1, 2 ]
if (amount === 0) return 1
if (amount < 0) return 0
let numberOfWays = 0
for (let i = 0; i < coinsArr.length; i++) {
numberOfWays += coins(amount - coinsArr[i])
}
return numberOfWays
}
기본 사례 이후에 기본적으로 동전 배열을 반복하여 나머지 금액을 변경하려고 합니다.
걸어가다
이 재귀 트리를 따를 수 있도록 몇 가지 입력을 살펴보겠습니다. 먼저 amount = 4
로 함수를 호출합니다. 첫 번째 동전 1부터 시작하여 현재 금액인 4에서 빼서 3을 얻습니다. 그런 다음 해당 숫자로 coins
를 다시 호출합니다. 그런 다음 양 3으로 coins
함수를 다시 입력하고 첫 번째 동전 1부터 다시 시작합니다. 3에서 1을 빼고 동전을 2로 다시 호출합니다. 1에서 1을 빼고 0을 얻을 때까지 계속합니다. 첫 번째 기본 사례를 선택하고 numberOfWays
변수에 1을 추가합니다. 이것이 1,1,1,1 방식입니다. 우리는 (양이 1인) for 루프로 돌아가서 2를 빼고 -1을 얻습니다. 이것은 우리를 다른 기본 사례로 가져오고 0을 반환합니다. 등등. 이것은 아래 트리로 표시됩니다.
아직 발견하지 못하셨나요?
맞습니다. 동일한 동전의 다른 순열로 인해 일부 조합을 여러 번 계산하고 있습니다. 1,1,2, 1,2,1 및 2,1,1은 우리의 목적을 위해 모두 동일한 조합입니다. 그렇다면 coins 함수를 호출할 때마다 각 for 루프를 다시 시작하지 않는 방법은 무엇입니까? 물론 우리가 원하는 코인을 전달하세요! 또 다른 좋은 팁 - 함수 서명에 대해 면접관과 이야기하십시오. 추가 매개변수가 언제 필요하거나 필요할지 알 수 없습니다. 일반적으로 이것은 면접관과 좋은 대화 포인트가 될 수 있습니다. 부끄러워하지 마세요!
코드는 다음과 같습니다.
function coins (amount, idx) {
const coinsArr = [ 1, 2 ]
if (amount === 0) return 1
if (amount < 0) return 0
let numberOfWays = 0
for (let i = idx; i < coinsArr.length; i++) {
numberOfWays += coins(amount - coinsArr[i], i)
}
return numberOfWays
}
다음은 이를 시각화하는 데 도움이 되는 트리입니다.
모두 수고하셨습니다! 다음 주에 제가 가장 좋아하는 사이드 프로젝트Breadwinnerss를 구축한 방법에 대해 자세히 설명하겠습니다.
Reference
이 문제에 관하여(재귀 마스터하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/coderbyte/mastering-recursion-10m7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// see if you can spot the bug before I complete this function below!
function coins (amount) {
const coinsArr = [ 1, 2 ]
if (amount === 0) return 1
if (amount < 0) return 0
let numberOfWays = 0
for (let i = 0; i < coinsArr.length; i++) {
numberOfWays += coins(amount - coinsArr[i])
}
return numberOfWays
}
이 재귀 트리를 따를 수 있도록 몇 가지 입력을 살펴보겠습니다. 먼저
amount = 4
로 함수를 호출합니다. 첫 번째 동전 1부터 시작하여 현재 금액인 4에서 빼서 3을 얻습니다. 그런 다음 해당 숫자로 coins
를 다시 호출합니다. 그런 다음 양 3으로 coins
함수를 다시 입력하고 첫 번째 동전 1부터 다시 시작합니다. 3에서 1을 빼고 동전을 2로 다시 호출합니다. 1에서 1을 빼고 0을 얻을 때까지 계속합니다. 첫 번째 기본 사례를 선택하고 numberOfWays
변수에 1을 추가합니다. 이것이 1,1,1,1 방식입니다. 우리는 (양이 1인) for 루프로 돌아가서 2를 빼고 -1을 얻습니다. 이것은 우리를 다른 기본 사례로 가져오고 0을 반환합니다. 등등. 이것은 아래 트리로 표시됩니다.아직 발견하지 못하셨나요?
맞습니다. 동일한 동전의 다른 순열로 인해 일부 조합을 여러 번 계산하고 있습니다. 1,1,2, 1,2,1 및 2,1,1은 우리의 목적을 위해 모두 동일한 조합입니다. 그렇다면 coins 함수를 호출할 때마다 각 for 루프를 다시 시작하지 않는 방법은 무엇입니까? 물론 우리가 원하는 코인을 전달하세요! 또 다른 좋은 팁 - 함수 서명에 대해 면접관과 이야기하십시오. 추가 매개변수가 언제 필요하거나 필요할지 알 수 없습니다. 일반적으로 이것은 면접관과 좋은 대화 포인트가 될 수 있습니다. 부끄러워하지 마세요!
코드는 다음과 같습니다.
function coins (amount, idx) {
const coinsArr = [ 1, 2 ]
if (amount === 0) return 1
if (amount < 0) return 0
let numberOfWays = 0
for (let i = idx; i < coinsArr.length; i++) {
numberOfWays += coins(amount - coinsArr[i], i)
}
return numberOfWays
}
다음은 이를 시각화하는 데 도움이 되는 트리입니다.
모두 수고하셨습니다! 다음 주에 제가 가장 좋아하는 사이드 프로젝트Breadwinnerss를 구축한 방법에 대해 자세히 설명하겠습니다.
Reference
이 문제에 관하여(재귀 마스터하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/coderbyte/mastering-recursion-10m7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)