所以,我坚持使用这段代码几个小时。
function amountTocoins(amount, coins) {
if (amount === 0) {
return [];
} else {
if (amount >= coins[0]) {
left = (amount - coins[0]);
return [coins[0]].concat( amountTocoins(left, coins));
} else {
coins.shift();
return amountToCoins(amount, coins);
}
}
}
document.write(amountTocoins(46, [25, 10, 5, 2, 1])); /25, 10, 10, 1
据我所知,这里的金额是46,而硬币是25,10,5,2,1,所以紧随其后,金额大于或等于硬币,下一篇:
left = (amount - coins[0]);
基本上是25(零索引),下一个;
return [coins[0]].concat( amountTocoins(left, coins));
concat()方法用于合并两个或多个数组,但是如何在这个特定的代码中合并?输出为:25,10,10,1,我在上面的代码中也给出了评论。
我希望我能很好地描述我的问题
答案 0 :(得分:0)
你在这里处理的术语是recursion
- 一个函数在它的体内调用自身的现象。你在两个地方(第6和第9行)调用你自己的amountTocoins
函数。
在你的行中:
return [coins[0]].concat( amountTocoins(left, coins));
暂停连接,直到执行对amountTocoins
函数的新调用并返回值。在您的示例中,您的行被解释为:
return [25].concat(amountTocoins(21, [25, 10, 5, 2, 1]))
在执行amountTocoins(21, [25, 10, 5, 1, 2])
之前,您的[25].concat(..)
功能未执行。
你会越走越深,直到你达到停止这个嵌套函数调用(递归)的底线条件。在您的情况下,条件为amount === 0
,它将返回将与其连接的第一个值,即空数组[]
。
注意:您在上一次amountTocoins
函数调用中遇到错字(第9行)。