javascript - 拼接和移位函数在递归中没有按预期工作
问题描述
我正在编写我的第一行JS
代码,现在我正在尝试做一个简单的递归函数。
我知道splice()
并shift()
删除了他们提取的项目。
我在这里遇到了麻烦:
function sub (...par) { // It could take an arbitrary number of parameters
if (par.length >= 2)
{
var val = par.shift();
//val = par.splice(0,1);
return val - sub(par);
}
else
{
/*EDIT*/ //return par[0];
return -par[0];
}
}
现在如果我运行:sub (17,7)
我正确地得到了10
,但是如果我运行sub(17,7,3)
而不是得到8
我得到了NaN
。
感谢 Jonas Wilms 的帮助,这样修复:
function sub (...par) { // It could take an arbitrary number of parameters
if (par.length >= 2)
{
var val = par.shift();
//val = par.splice(0,1);
return val - sub(...par);
}
else
{
/*EDIT*/ //return par[0];
return -par[0];
}
}
解决方案
你必须传播递归调用:
return val - sub(...par);
否则par
被调用的内部sub
将是一个包含数组的数组,并且对其进行减法将失败。
但是,如果您直接采用第一个参数,整个事情会更加优雅:
function sub(head, ...rest) {
if(!rest.length) return head;
return head - sub(...rest);
}
但是应该注意,您可能不会得到您期望的结果,因为您在左侧之前计算右侧,所以
sub(1, 2, 3)
等于
1 - (2 - 3)
那就是2。
我认为如果可以通过以下方式实现sub(1, 2, 3)
平等会更清楚1 - 2 - 3
:
function sub(...rest) {
if(rest.length === 1) return rest[0];
const last = rest.pop();
return sub(...rest) - last;
}
或者没有递归:
const sub = (...args) => args.reduce((a, b) => a - b);
推荐阅读
- r - 使用 R 将一列中的值添加到另一列中缺少第二列中的值
- android - 响应式图像 - 如何?
- python - 使用pandas包在python中组合来自多个excel文件的数据
- sql-server - SP_EXECUTESQL 中的 SQL 注入
- dataset - 在 KITTI 数据集中,哪个序列的初始速度为 0?
- flutter - Flutter GestureDetector 根本不工作
- angular - 剑道树视图的复选框样式问题
- swift - 丢弃 UITableView 内的更改不会反映在 UITextView 不可见但处于活动状态的单元格上
- react-bootstrap - 如何在图像的 src 路径中集成变量?
- python - 如何为 micropython 构建 sphinx 文档