javascript递归函数无法正常工作
我创建了一个javascript递归函数来调整日期:如果日期是周六、周日或美国公共假日,那么该日期将滚动到下一天,直到相关日期不是假日为止。我使用'moment.js'包和相关的'moment holiday.js'文件 代码如下:javascript递归函数无法正常工作,javascript,recursion,momentjs,Javascript,Recursion,Momentjs,我创建了一个javascript递归函数来调整日期:如果日期是周六、周日或美国公共假日,那么该日期将滚动到下一天,直到相关日期不是假日为止。我使用'moment.js'包和相关的'moment holiday.js'文件 代码如下: <!doctype html> <script src="moment.js"></script> <script src="moment-holiday.js"></script> <scrip
<!doctype html>
<script src="moment.js"></script>
<script src="moment-holiday.js"></script>
<script>
function CalcDueDate(dueDate){
var dueDay = moment(dueDate).day();
console.log(dueDay);
if(dueDay == 0 || dueDay == 6 || IsUSHoliday(dueDate) !== undefined ){
dueDate = moment(dueDate).add(1, 'day').format();
console.log('a', dueDate);
CalcDueDate(dueDate);
}
console.log('b', dueDate);
return dueDate;
}
d = "2018-05-19"
var finalDue = CalcDueDate(d);
console.log(finalDue);
</script>
第一个“b”和日期“2018-05-21”与预期一致,但我不明白为什么会出现第二个和第三个“b”,并将日期带回“2018-05-20”。有人能告诉我我的代码哪里做错了吗?
谢谢。递归函数通常返回一个值(如边缘大小写)或递归调用的值。对于这两种情况,您当前返回一次。因此,您不仅得到了额外的
console.logs()
,而且还得到了错误的最终返回值5/20/18,这是一个星期日。解决方法是确保返回一个或另一个,其中包含以下内容:
function CalcDueDate(dueDate){
var dueDay = moment(dueDate).day();
console.log(dueDay);
if(dueDay == 0 || dueDay == 6 || IsUSHoliday(dueDate) !== undefined ){
dueDate = moment(dueDate).add(1, 'day').format();
console.log('a', dueDate);
// return the result of recursion.
return CalcDueDate(dueDate);
}
else { // you actually don't need the else -- just here to make it clearer.
// OR return the edge case
console.log('b', dueDate);
return dueDate;
}
}
粗略的一瞥告诉我你应该做
dueDate=CalcDueDate(dueDate)代码>而不仅仅是CalcDueDate(dueDate)代码>
function CalcDueDate(dueDate){
var dueDay = moment(dueDate).day();
console.log(dueDay);
if(dueDay == 0 || dueDay == 6 || IsUSHoliday(dueDate) !== undefined ){
dueDate = moment(dueDate).add(1, 'day').format();
console.log('a', dueDate);
// return the result of recursion.
return CalcDueDate(dueDate);
}
else { // you actually don't need the else -- just here to make it clearer.
// OR return the edge case
console.log('b', dueDate);
return dueDate;
}
}