【问题标题】:what does a recursive closure returns to?递归闭包返回什么?
【发布时间】:2016-11-15 16:00:00
【问题描述】:

我想编写一个函数(持久性),它接受一个正参数 num 并返回它的乘法持久性,这是您必须将 num 中的数字相乘直到达到一个数字的次数。 例如:

persistence(39) === 3 // because 3*9 = 27, 2*7 = 14, 1*4=4
                      // and 4 has only one digit

persistence(999) === 4 // because 9*9*9 = 729, 7*2*9 = 126,
                       // 1*2*6 = 12, and finally 1*2 = 2

persistence(4) === 0 // because 4 is already a one-digit number

我写了这个:

function persistence(num) {
   //code me
   var f;
   f= countPersistence(num);
   var toReturn= f(num); console.log("received value: "+toReturn);
   return toReturn;
}

function countPersistence(num){
  var count=0;
  return function g(num){
    var numt=num+"";
    numt=numt.split("");
    if(numt.length>1){
      count++;
      for(var i=0; i<numt.length-1; i++){
        numt[i+1]=numt[i]*numt[i+1];
      }
      arguments.callee(numt[numt.length-1]);
    }
    else 
      { console.log("returned value: "+count); return count;}
  }

}

正如您在运行此代码时看到的,内部函数的返回值与预期的不完全一样。 事实上,一个函数应该返回到它被调用的地方,对吧?但在这种情况下,因为它是递归的,所以它是从自身调用的。 我不知道如何检索实际值(不使用全局变量)

【问题讨论】:

  • 仅供参考:arguments.callee 已被弃用....

标签: javascript recursion closures


【解决方案1】:

递归调用内部函数时不会返回值。您可以像这样修复它(删除 else 块并使其成为通用代码),以便始终返回 count 的最后更新值:

function persistence(num) {
   //code me
   var f;
   f= countPersistence(num);
   var toReturn= f(num); 
   return toReturn;
}

function countPersistence(num){
  var count=0;
  return function g(num){
    var numt=num+"";
    numt=numt.split("");
    if(numt.length>1){
      count++;
      for(var i=0; i<numt.length-1; i++){
        numt[i+1]=numt[i]*numt[i+1];
      }
      arguments.callee(numt[numt.length-1]);
    }
    return count;
  }
}

console.log(persistence(39)); // 3
console.log(persistence(999)); // 4
console.log(persistence(4));  // 0 

arguments.callee 已被弃用,而且您使用嵌套函数使事情变得过于复杂。

你可以这样做:

function persistence(num){
  return num < 10 ? 0
       : 1 + persistence(String(num).split('').reduce((a, b) => a*b));
}

console.log(persistence(39)); // 3
console.log(persistence(999)); // 4
console.log(persistence(4)); // 0

【讨论】:

    【解决方案2】:

    你没有返回递归行

    return arguments.callee(numt[numt.length-1]);
    

    正如我在 cmets arguments.callee 中所说,已弃用,因此您应该使用函数名称。

    return g(numt[numt.length-1]);
    

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 2014-04-22
      • 2021-12-23
      • 1970-01-01
      相关资源
      最近更新 更多