2016-08-10 6 views
1

재귀가 재현하는 방법이 복잡한 문제를 해결할 수있는 방법에 관한 모든 것이 마법처럼 보입니다.이 알고리즘을 아름답게 설명하는 this 종이를 읽었습니다. 여기에 자바 스크립트에 내 코드입니다 :서브 세트 합계를 추적하는 재귀 스택 추적

function allButLast(arr) { 
    return arr.slice(0, arr.length - 1); 
} 

function sSum(arr, sum) { 
    //console.log(arr + ':' + sum); 
    if (sum === 0) return true; 
    if (sum < 0 || arr.length === 0) return false; 

    return sSum(allButLast(arr), sum) || sSum(allButLast(arr), sum - arr.slice(-1)); 
} 

/* 
sSum([1, 2], 3) 
sSum([1], 3) || sSum([1, 2], 1) 
sSum([], 3) || sSum([], 2) || sSum([1, 2], 1) 
false || sSum([], 2) || sSum([1, 2], 1) 
false || false || sSum([1, 2], 1) 
false || false || sSum([1], 1) || sSum([1], 1) 
false || false || sSum([], 1) || sSum([], 0) || sSum([1], 1) 
false || false || false || true || sSum([1], 1) // evaluation stops here 
*/ 
//console.log(sSum([1, 2], 3)); // true 

내가 이해하고 내가 주석에 설명 한 함수 호출을 디버깅, 내가 전화를 실행하는 방법을 그건 알고 싶어하고 싶었다는 내가 제대로 추적입니까?

답변

1

첫 번째 수준 sSym (1, 3) || sSum (1, 1)
그러면 sSym (1, 3)은 sSym (, 3)이됩니다. sSum (, 2) => 거짓 || False
및 sSum (1, 1)이 sSym (, 1)이됩니다. || sSum (, 0) => 거짓 || 사실
당신은 SSUM의 반환을 부른 전에
console.log('sSym(' + allButLast(arr) + ', '+ sum +') || sSum('+ allButLast(arr) + ', '+ (sum - arr.slice(-1)) +')')
을 추가 할 수 있으며 이는 디버깅

에 도움이 될 것입니다