我如何将两个函数组合在一起,两个函数都在内部递归

时间:2017-06-30 21:00:29

标签: javascript recursion closures

我是初学者,这是我在这里发表的第一篇文章(加上我不是母语为英语的人),所以如果我的代码和/或我的英语不好,请原谅我。给我两个数字我想写一个JavaScript函数找出第二个是否是第一个的幂,然后确定该功率(例如:2.8输出必须为3)。我写了两个函数,都工作,但我不能把它们放在一起。

这是第一个检查第二个数字是否是第一个数字的力量。

function checkNumbers(x,y){
  if (y%x !==0){
    return "this numbers are not valid"
  }
  else if(x===y) {
     return "correct!"
  }
  else { 
    y=y/x
    return checkNumbers(x,y)
  }  
}

checkNumbers(2,8)   // will give the first answer
checkNumbers(2,18)  // will give the second answer

第二个函数将给出积分对数:

count =1;

function findGrade(x,y) {
  if(y/x===1)
    return "the grade is " + count;

  count++;
  y = y/x;
  return findGrade(x,y)
}

findGrade(2,8)  // output 3
findGrade(2,16) // output 4

如何将它们组合成一个功能?我想我需要一个闭包,但我没有找到让它起作用的方法。

3 个答案:

答案 0 :(得分:1)

checkNumbers应返回布尔值,而不是消息。然后findGrade可以检查结果以查看它是否应该计算对数。像这样:

function checkNumbers(x,y){
  if (y%x !==0){
    return false
  }
  else if(x===y) {
     return true
  }
  // the rest of your function remains the same.

function findGrade(x,y) {
  // First, check to see whether y is a power of x
  if checkNumbers(x,y) {
    // your original findGrade function goes here
  }
  else
    return -1;  // Use this as a failure code.

这对你有用吗?

另一种可能性是完全结合这些功能:尝试找到对数(你称之为“等级”);如果它有效,你会得到答案;如果失败(在y%x !== 0),则报告失败。

答案 1 :(得分:0)

我不确定我的方法是否不同,但我已经在下面实现了它。在实际应用程序中,我会对输入进行更多的类型检查,并检查是否存在第三个参数:如果不是默认值为0(第一次迭代默认计数为0),但这是一般的想法。您可以在下面运行代码段。

// Arguments 
// 1: Base of Exponent
// 2: test Number
// 3: count by reference

function checkPower (base, test, count) {
  let division = test/base
  // base case
  if (division === 1) {
    count++
    return count
  } else if (division < 1) {
    console.log("not a power")
    return;
  }
  // iteration step
  count++
  return checkPower(base, division, count++)
}

// Test Cases

let test = checkPower(2, 32, 0)
if (test) {
  console.log(test) // 5
}

test = checkPower(2, 1024, 0)
if (test) {
  console.log(test) // 10
}

test = checkPower(2, 9, 0)
if (test) {
  console.log(test) // "not a power"
}

答案 2 :(得分:0)

事实上,解决方案非常简单。

您可以执行以下操作:

function findGrade(x, y, count = 1) {
    // If the numbers are not valid, throw an error. The execution is interrupted.
    if(y % x != 0) throw "Invalid inputs";

    // If the inputs are different, continue the execution and add 1 to count.
    if(x != y) return findGrade(x, y/x, ++count);

    // If none of the above are true, you have your result!
    return count;
}

试验:

console.log(findGrade(2, 8));        // Outputs 3
console.log(findGrade(2, 16));       // Outputs 4
console.log(findGrade(2, 3));        // Error: Invalid inputs
console.log(findGrade(3, 3486784401));  // Outputs 20

如果您需要任何进一步的帮助,请与我们联系。