javascript递归函数无法正常工作

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

我创建了一个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>
第一个“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;    
    }
}