在尝试解决 "Palindrome" 挑战的 if 条件下在递归函数上获取 False

Getting False on a recursive function with if conditions trying to solve the "Palindrome" Challenge

所以我在做这个流行的挑战“回文”,我从“前端大师”Javascript 系列中复制这个解决方案,我得到了不同的输出。我想知道是否有什么变化或者我错过了什么。这是我在 Whosebug 上的第一个问题,因为这只是 MindF***k。

这是怎么回事?


'use strict'

function isPalindrome(str) {
  if (str.length <= 1) return true;
  var first = str[0];
  var last = str[str.length - 1];
  if (first === last) {
    console.log(str.substring(1, str.length - 1))
    isPalindrome(str.substring(1, str.length - 1));
  }
  return false;
}

console.log(isPalindrome("abcdcba")) // Return false on my machine

我在 RunJS 应用程序和 VScode 终端上尝试了这个,我也在文件上 运行 节点。

继续返回错误!!

当且仅当输入的长度为<= 1:

时,函数才会returntrue
if (str.length <= 1) return true;

不是:

isPalindrome("abcdcba")

函数中的only other return语句是:

return false;

看起来你的意思是到return递归结果:

return isPalindrome(str.substring(1, str.length - 1));

否则该函数不会对递归调用自身的结果做任何事情,只是在最后一行默认为 returning false

我修复了你的代码...

'use strict'

function isPalindrome(str) {
  if (str.length <= 1) return true;
  var first = str[0];
  var last = str[str.length - 1];
  if (first === last) {
    console.log(str.substring(1, str.length - 1))
    return isPalindrome(str.substring(1, str.length - 1));
  }else return false;
}

console.log(isPalindrome("abcdcba")) // 

我看到递归函数有两个不同的部分:

  1. 当函数开始调用自身并堆叠函数调用时继续。
  2. 当所有堆栈函数开始 returning 值时,以相反的方式返回。在您的示例中,此阶段在 if (str.length <= 1) return trueif first !== last.
  3. 之后开始

我认为你在前进时完全正确,但在回来时有一个小细节。你需要记住,你有你的解决方案,你需要通过所有调用返回初始值 return 值。

递归函数分为两部分:

function recursive{

  //forward processing
  ..
  resultValue = recursive()
  ..
  // backward processing if needed
  return kindOfResultValue //resultValue or a transformation if needed
}

注: Remember to check all conditional branches of your recursive function to return always a value after calling itself