javascript递归函数无法正常工作

时间:2018-04-18 13:52:49

标签: javascript recursion momentjs

我创建了一个javascript递归函数来调整日期:如果日期是星期六或星期日或美国公众假期,那么日期将滚动到第二天,直到相关日期不是假日。我使用'moment.js'包和相关的'moment-holiday.js'文件。

代码如下:

<!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>

当我运行它时,结果是:

6                                moment3.html:12 
a 2018-05-20T00:00:00+07:00      moment3.html:9 
0                                moment3.html:12 
a 2018-05-21T00:00:00+07:00      moment3.html:9 
1                                moment3.html:16 
b 2018-05-21T00:00:00+07:00      moment3.html:16 
b 2018-05-21T00:00:00+07:00      moment3.html:16 
b 2018-05-20T00:00:00+07:00      moment3.html:23 
2018-05-20T00:00:00+07:00

第一个'b'和'2018-05-21'的日期符合预期,但我不明白为什么第二个和第三个'b'出现了,并将日期带回'2018-05-20 ”。有人能告诉我我的代码在哪里做错了吗? 感谢。

1 个答案:

答案 0 :(得分:0)

递归函数通常返回类似边缘情况的值或递归调用的值。您目前正在为两种情况返回一次。因此,您不仅得到额外的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;    
    }
}