javascript中的递归和返回

javascript中的递归和返回,javascript,recursion,Javascript,Recursion,虽然我似乎已经找到了正确的答案,但我正在学习Javascript,并且我很难理解一个练习问题 该代码旨在帮助人们计算出当有人买东西时,他们应该返还多少钱。它接收一个数字,计算出他们应该归还多少个25美分和多少便士 我不明白的是: •代码第一次遇到第11行时不应该停止运行吗?若否,原因为何 •如果代码在进入第11行时停止运行,为什么我能够将代码放在第10行之后,并在给出答案之前执行三次?我发现情况就是这样,所以这让我质疑我对代码工作原理的理解!我添加了行quarters+=1在第10行之后,返回6

虽然我似乎已经找到了正确的答案,但我正在学习Javascript,并且我很难理解一个练习问题

该代码旨在帮助人们计算出当有人买东西时,他们应该返还多少钱。它接收一个数字,计算出他们应该归还多少个25美分和多少便士

我不明白的是:

•代码第一次遇到第11行时不应该停止运行吗?若否,原因为何

•如果代码在进入第11行时停止运行,为什么我能够将代码放在第10行之后,并在给出答案之前执行三次?我发现情况就是这样,所以这让我质疑我对代码工作原理的理解!我添加了行
quarters+=1在第10行之后,返回6

var change = 0;
var quarters = 0;
function howManyQuarters(howMuchMoney) {
  if (howMuchMoney < 0.25) {
    change = howMuchMoney;
    return 0;
  }
  else {
    quarters += 1;
    howManyQuarters(howMuchMoney-0.25);
    return quarters;  // << line 11
  }
}

change = 0.99;
console.log ("Pay out " + howManyQuarters(change) + " quarters");
console.log ("And you'll have " + change * 100 + " pennies left over");
var变化=0;
var=0;
功能多少季度(多少钱){
如果(多少钱<0.25){
改变=多少钱;
返回0;
}
否则{
季度+=1;
多少个季度(多少钱-0.25);

return quarters;//不一定。使用递归,可能会多次调用函数,每次调用都需要在代码为函数执行之前返回。因此,如果有多少个quarters被调用了3次,它将在函数调用后立即执行代码(在本例中为return语句)那也是很多次


希望这是清楚的。

不一定。使用递归,您可能会多次调用函数,每次调用都需要在代码为函数执行之前返回。因此,如果有多少个季度被调用了3次,它将在函数调用后立即执行代码(在本例中为return语句)那也是很多次


希望这是清楚的。

这就是递归的全部要点:函数在满足停止条件并变为真之前一直在调用自己,然后它就不再调用自己了

在这种情况下,是的,该函数确实会在
return quarters;
行停止,但此时它已经在前面的行中调用了自己

停止条件是确保不会有无限循环-调用函数时,给它一个数字-当该数字小于0.25时,函数将停止。因此:

基本示例:

  • 如果初始值小于0.25,函数将只运行一次,返回0
  • 如果初始值在0.25和0.5之间,函数将运行两次-自调用(递归)将发生一次,因为值不小于0.25,但自调用传递值减去0.25,因此现在第二次调用中的值将小于0.25-满足停止条件,一切正常

  • 返回值本身由函数外部声明的全局变量管理-每次函数调用自身时,它都会将该变量增加1,这样最终您就知道它被调用了多少次。正如您所看到的,这不是很聪明-秒内对函数的调用会带来错误的结果。

    是递归的全部要点:函数一直在调用自己,直到满足停止条件并变为真,然后它就不再调用自己了

    在这种情况下,是的,该函数确实会在
    return quarters;
    行停止,但此时它已经在前面的行中调用了自己

    停止条件是确保不会有无限循环-调用函数时,给它一个数字-当该数字小于0.25时,函数将停止。因此:

    基本示例:

  • 如果初始值小于0.25,函数将只运行一次,返回0
  • 如果初始值在0.25和0.5之间,函数将运行两次-自调用(递归)将发生一次,因为值不小于0.25,但自调用传递值减去0.25,因此现在第二次调用中的值将小于0.25-满足停止条件,一切正常

  • 返回值本身由函数外部声明的全局变量管理-每次函数调用自身时,它都会将该变量递增1,这样最终您就知道它被调用了多少次。正如您所看到的,这不是很聪明-秒内对函数的调用会带来错误的结果。

    代码不会在第11行第一次停止运行,因为它第一次到达第10行时(实际上)会返回第3行

    试着这样描述它。我已经列出了递归的级别:

    1.  (Line 15) howManyQuarters(0.99)
        2.  (Line 4) howMuchMoney is > 0.25...so else applies
        3.  (Line 10) howManyQuarters(0.74)  --> 0.74 = 0.99-0.25
            4.  (Line 4) howMuchMoney is > 0.25...so else applies
            5.  (Line 10) howManyQuarters(0.49)  --> 0.49 = 0.74-0.25
                6.  (Line 4) howMuchMoney is > 0.25...so else applies
                7.  (Line 10) howManyQuarters(0.24)  --> 0.24 = 0.49-0.25
                    8. (Line 4) howMuchMoney is < 0.25...so enter main body of if clause
                    9. (Line 6) return 0;
                11. (Line 11) return quarters;
            12. (Line 11) return quarters;
        13. (Line 11) return quarters;
    14. (Line 11) return quarters;
    
    1.(第15行)多少个季度(0.99)
    2.(第4行)howMuchMoney大于0.25…因此其他适用
    3.(第10行)多少个季度(0.74)-->0.74=0.99-0.25
    4.(第4行)howMuchMoney大于0.25…因此其他适用
    5.(第10行)多少个季度(0.49)-->0.49=0.74-0.25
    6.(第4行)howMuchMoney大于0.25…因此其他适用
    7.(第10行)多少个季度(0.24)-->0.24=0.49-0.25
    8.(第4行)howMuchMoney<0.25…因此请输入if条款的主体
    9.(第6行)返回0;
    11.(第11行)返回宿舍;
    12.(第11行)返回宿舍;
    13.(第11行)返回宿舍;
    14.(第11行)返回宿舍;
    
    代码第一次在第11行上运行时不会停止,因为它第一次到达第10行时(实际上)会返回第3行

    试着这样描述它。我已经列出了递归的级别:

    1.  (Line 15) howManyQuarters(0.99)
        2.  (Line 4) howMuchMoney is > 0.25...so else applies
        3.  (Line 10) howManyQuarters(0.74)  --> 0.74 = 0.99-0.25
            4.  (Line 4) howMuchMoney is > 0.25...so else applies
            5.  (Line 10) howManyQuarters(0.49)  --> 0.49 = 0.74-0.25
                6.  (Line 4) howMuchMoney is > 0.25...so else applies
                7.  (Line 10) howManyQuarters(0.24)  --> 0.24 = 0.49-0.25
                    8. (Line 4) howMuchMoney is < 0.25...so enter main body of if clause
                    9. (Line 6) return 0;
                11. (Line 11) return quarters;
            12. (Line 11) return quarters;
        13. (Line 11) return quarters;
    14. (Line 11) return quarters;
    
    1.(第15行)多少个季度(0.99)
    2.(第4行)howMuchMoney大于0.25…因此其他适用
    3.(第10行)多少个季度(0.74)-->0.74=0.99-0.25
    4.(第4行)howMuchMoney大于0.25…因此其他适用
    5.(第10行)多少个季度(0.49)-->0.49=0.74-0.25
    6.(第4行)howMuchMoney大于0.25…因此其他适用
    7.(行)
    
    function howMuchMoney(val) {
        return [
            Math.floor(val / 0.25),
            parseFloat((val % 0.25).toFixed(2))
        ];
    }
    
    function myRecursive(nSizeData){
      if(baseCondition is TRUE){
        //compute the function with nSizeData
        //do stuff here
      }
      else{
        //call the same function with a smaller size set of data
        //this condition ensure that the baseCondition will eventually be matched
        myRecursive(mSizeData);
      }
    }
    
    function factorial(n){
      if(n==0 || n==1){
        return 1;
      }
      else{
        return factorial(n-1);
      }
    }
    
    return quarters;
    
    howManyQuarters(howMuchMoney-0.25);