繁体   English   中英

javascript递归功能无法正常工作

[英]javascript recursive function does not work properly

我创建了一个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”。 有人可以告诉我我的代码在哪里做错了吗? 谢谢。

递归函数通常返回一个值(如边缘情况)或一个递归调用的值。 您目前针对这两种情况都返回一次。 因此,不仅获得了额外的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;    
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM