javascript递归参数递减

时间:2016-11-16 15:34:50

标签: javascript recursion parameter-passing

你好,我的学习是递归的,但我不知道要解决这个问题, 因为这个参数使用2个参数,我不知道如何用2个参数返回。

这是正常循环,not a recursive但是我不知道如何将其更改为recursive

function deret2(num,num2){
  var tampung = 1;
   for (var i= num; i >= 1 ; i-= num2){

    tampung = tampung * i ;
  }
  console.log(tampung);
}
deret2(12,5); //12* 7 * 2 = 168

编辑:我做的递归:

function deret(num,num2) {
  //var tampung = 1;
  if (num <= 0) { // terminal case
    return 1;
  } else 
  { // block to execute
    return num * deret(num-num2,num2); 
  }
};
deret(12,5);

它不会工作原因number* deret(2 arguments here) ??这就是为什么我不知道如何使用2个参数进行递归,你怎么能保存并将它与2个参数相乘?

3 个答案:

答案 0 :(得分:7)

你可以使用带有check的递归函数。

你需要一个递归函数检查递归是否应该停止,或者函数是否应该使用相同或更改的参数再次调用。然后在两种情况下都需要返回值。

经验法则,对于乘法,返回上一个值1和添加0

num  num2  return
---  ----  ------------------
 12     5  12 * deret2(7, 5)
  7     5   7 * deret2(2, 5)
  2     5   2 * deret2(-3, 5)
 -3     5   1

function deret2(num, num2) {
    return num >= 1 ? num * deret2(num - num2, num2) : 1;
}

console.log(deret2(12, 5)); //12* 7 * 2 = 168

使用if语法。

function deret2(num, num2) {
    if (num >= 1) {
        return num * deret2(num - num2, num2);
    } else {
        return 1;
    }
}

console.log(deret2(12, 5)); //12* 7 * 2 = 168

奖金:最短的版本。

function deret2(num, num2) {
    return +(num < 1) || num * deret2(num - num2, num2);
}

console.log(deret2(12, 5)); //12* 7 * 2 = 168

答案 1 :(得分:3)

递归函数应该在函数内部声明,并且在条件:

时停止
function deret2(startNumber,step){
   if(startNumber>= 1){
     return startNumber * deret2(startNumber - step, step);
   }else{
     return 1;
   }
}
deret2(12,5); //12* 7 * 2 = 168

答案 2 :(得分:2)

递归函数调用自身,并且使用额外的参数,我们不需要跟踪变异变量。循环和递归是非常密切相关的,转换是机械的。

function deret2(num,num2,tampung){
  if (num >= 1) {
    deret2(num - num2, num2, tampung * num);
  } else {
    console.log(tampung);
  }
}
deret2(12,5,1); //12* 7 * 2 = 168

请注意,我们现在直接传递tampung的初始值,而不是将其编码到递归中。如果您不希望调用者传递tampung的基值,那么制作一个辅助函数来编码该基本情况然后开始递归是相当常见的。