Возможно, добавление некоторого протоколирования может сделать его более понятным.
Мы можем добавить простой регистратор, который сообщает значения следующим образом:
Calling with 5
| Calling with 4
| | Calling with 3
| | | Calling with 2
| | | | Calling with 1
| | | | | Calling with 0
| | | | | Returning [] (base case)
| | | | Pushing 1 to []
| | | | Returning [1]
| | | Pushing 2 to [1]
| | | Returning [1,2]
| | Pushing 3 to [1,2]
| | Returning [1,2,3]
| Pushing 4 to [1,2,3]
| Returning [1,2,3,4]
Pushing 5 to [1,2,3,4]
Returning [1,2,3,4,5]
Итак, массив был определен в базовом случае . Затем, когда мы вернулись к стеку вызовов, мы добавили его. Есть альтернативные способы сделать это, но это один из распространенных и разумных способов go об этом.
Вы можете увидеть, как я добавил ведение журнала, в следующем фрагменте:
const log = (depth, message) =>
console .log ('| '.repeat (depth - 1) + message)
function countup(n, depth = 1) {
log(depth, `Calling with ${n}`)
if (n < 1) {
log(depth, `Returning [] (base case)`)
return [];
} else {
const countArray = countup(n - 1, depth + 1); //the storing of 5,4,3,2,1 I don't understand
log(depth, `Pushing ${n} to [${countArray}]`)
countArray.push(n); //I don't understand when countArray was defined as an array
log(depth, `Returning [${countArray}]`)
return countArray;
}
}
countup(5)
.as-console-wrapper {min-height: 100% !important; top: 0}
Обновление
Возможно, более ясным будет следующий результат:
/ Calling with 5
| / Calling with 4
| | / Calling with 3
| | | / Calling with 2
| | | | / Calling with 1
| | | | | / Calling with 0
| | | | | \ Returning [] (base case)
| | | | | Pushing 1 to []
| | | | \ Returning [1]
| | | | Pushing 2 to [1]
| | | \ Returning [1,2]
| | | Pushing 3 to [1,2]
| | \ Returning [1,2,3]
| | Pushing 4 to [1,2,3]
| \ Returning [1,2,3,4]
| Pushing 5 to [1,2,3,4]
\ Returning [1,2,3,4,5]
Что включает лишь незначительные изменения в ведении журнала выписки:
const log = (depth, message) =>
console .log ('| '.repeat (depth - 1) + message)
function countup(n, depth = 1) {
log(depth, `/ Calling with ${n}`)
if (n < 1) {
log(depth, `\\ Returning [] (base case)`)
return [];
} else {
const countArray = countup(n - 1, depth + 1); //the storing of 5,4,3,2,1 I don't understand
log(depth, `| Pushing ${n} to [${countArray}]`)
countArray.push(n); //I don't understand when countArray was defined as an array
log(depth, `\\ Returning [${countArray}]`)
return countArray;
}
}
countup(5)
.as-console-wrapper {min-height: 100% !important; top: 0}