【问题标题】:Getting False on a recursive function with if conditions trying to solve the "Palindrome" Challenge如果条件试图解决“回文”挑战,则在递归函数上获得 False
【发布时间】:2021-01-29 19:15:57
【问题描述】:

所以我在做这个受欢迎的挑战“回文”,我从“前端大师”Javascript 系列中复制了这个解决方案,我得到了不同的输出。我想知道是否有什么变化或者我错过了什么。这是我在 * 上的第一个问题,因为这只是 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 终端上尝试了这个,我还在文件上运行了 Node。

保持返回错误!!

【问题讨论】:

  • 只有当你传入一个字符串 但没有返回任何递归调用结果。

标签: javascript if-statement recursion palindrome


【解决方案1】:

函数将返回true当且仅当输入的长度为&lt;= 1:

if (str.length <= 1) return true;

不是这样的:

isPalindrome("abcdcba")

函数中唯一的其他return语句是:

return false;

您的意思是返回递归结果:

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

否则该函数永远不会对递归调用自身的结果做任何事情,并且默认在最后一行返回false

【讨论】:

    【解决方案2】:

    我修复了你的代码...

    '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. 当所有堆栈函数开始返回值时,以相反的方式倒退。在您的示例中,此阶段在 if (str.length &lt;= 1) return trueif first !== last 之后开始。

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

    递归函数有点像一分为二:

    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

    【讨论】: