【问题标题】:Recursive palindrome check with JavaScript使用 JavaScript 进行递归回文检查
【发布时间】:2019-01-05 03:50:44
【问题描述】:

我试图通过使用 javascript 的递归来找出一个字符串是否是回文。但我无法弄清楚我在代码中缺少什么。

var firstCharacter = function(str) {
    return str.slice(0, 1);
};

var lastCharacter = function(str) {
    return str.slice(-1);
};

var middleCharacters = function(str) {
    return str.slice(1, -1);
};

var isPalindrome = function(str) {
    if(str.length < 2) {
        return true;
    } else {
        if(firstCharacter(str) == lastCharacter(str)) {
            isPalindrome(middleCharacters(str));
        } else return false;
    }
};

var checkPalindrome = function(str) {
    console.log("Is this word a palindrome? " + str);
    console.log(isPalindrome(str));
};


checkPalindrome("a");
//Program.assertEqual(isPalindrome("a"), true);
checkPalindrome("matom");
//Program.assertEqual(isPalindrome("motor"), false);
checkPalindrome("rotor");
//Program.assertEqual(isPalindrome("rotor"), true);

递归调用肯定有问题。我很想得到你的帮助。谢谢。我附上了我的代码的输出。

【问题讨论】:

  • 你忘了return递归调用。
  • .slice 返回一个数组,然后您尝试使用firstCharacter(str) == lastCharacter(str) 比较两个切片。你不能像那样比较数组。

标签: javascript recursion palindrome


【解决方案1】:

这个解决方案怎么样?

function isPalindrome(str){
  if (str.length > 3) return isPalindrome(str.substring(1, str.length-1));
  return str[0] === str[str.length-1];
}

【讨论】:

    【解决方案2】:
    const isPalindrome = str => {
        
        // base case
        if(str.length === 1) return true;
        if(str.length === 2) return str[0] === str[1];
    
        if(str[0] === str[str.length - 1]) {
            return isPalindrome(str.slice(1, -1))
        }
    
        return false;
    }
    

    你可以使用递归

    基本情况

    如果字符串是一个字符,我们有一个基本情况(简单情况),我们只需返回 true。

    如果它有两个字符,我们检查第一个字符是否与第二个字符相同,如果它们相同,则返回 true。

    递归案例

    如果超过两个字符,我们检查第一个和最后一个字符是否相同,如果它们不同,我们只返回 false

    但是如果它们是相同的,那么我们现在想对其他字符做同样的事情,所以我们用相同的字符串调用相同的函数,但删除第一个和最后一个字符,因为我们已经知道它们是相同的,我们继续直到我们达到了基本情况。

    希望对你有用

    一些测试

    isPalindrome('p')    // true
    isPalindrome('po')   // false
    isPalindrome('pp')   // true
    isPalindrome('pop')  //true
    

    【讨论】:

    • 请注意,这将失败并显示一个空字符串。如果你用if (str .length &lt; 2) return true 替换你的两个基本保护套,它将被修复和简化。另请注意,函数名称拼写错误。
    【解决方案3】:

    这是一个简单的答案。基本上,我们将第一个字符与最后一个字符进行比较并采取相应的行动。

    const isPalindrome = str => {
      if (str.length <= 1) return true;
      if (str[0] !== str[str.length - 1]) return false;
      
      return isPalindrome(str.slice(1,-1))
    }
    

    【讨论】:

      【解决方案4】:

      这是另一个递归回文。

      function checkPalindrome(str){
          if(str.length === 1) return true;
          if(str.length === 2) return str[0] === str[1];
          if(str[0] === str.slice(-1)) return checkPalindrome(str.slice(1,-1))
          return false;
      }
      
      console.log(checkPalindrome('a')) // true
      console.log(checkPalindrome('matom')) // false
      console.log(checkPalindrome('rotor')) // true
      

      【讨论】:

        【解决方案5】:
            const isPalindrome = str => {
            const strLen = str.length;
            if (strLen < 2) return true;
        
            if (str[0] === str[strLen - 1]) {
                return isPalindrome( str.slice(1, strLen - 1) );
            }
        
            return false;
        };
        
        console.log(isPalindrome('madam'));
        

        【讨论】:

        • 这个可以修改:if (strLen &lt; 2) return true;
        【解决方案6】:

        使用slice 创建一个数组——如果你想比较第一个和最后一个字符,你需要在应用==之前从数组中提取值——

        var firstCharacter = function(str) {
            return str.slice(0, 1)[0] // <-- get the first element of the slice
        }
        
        var lastCharacter = function(str) {
            return str.slice(-1)[0] // <-- get the first element of the slice
        }
        

        这是另一个递归解决方案,它使用参数l(左)和r(右)使用索引检查字符串(而不是使用slice 创建中间值)-

        const palindrome = (s = "", l = 0, r = s.length - 1) =>
          r - l < 2
            ? true
            : s[l] === s[r] && palindrome (s, l + 1, r - 1)
        
        console.log
          ( palindrome ("motor")   // false
          , palindrome ("rotor")   // true
          , palindrome ("racecar") // true
          , palindrome ("wow")     // true
          , palindrome ("i")       // true
          )

        这是一个相互递归的定义。这很浪费,但它有一个优雅的形式 -

        const pal = ([ s, ...more ]) =>
          more.length === 0 || pal2 (more.reverse(), s)
        
        const pal2 = ([ s, ...more ], q) =>
          s === q && pal (more.reverse())
        
        console.log
          ( pal ("motor")   // false
          , pal ("rotor")   // true
          , pal ("racecar") // true
          , pal ("wow")     // true
          , pal ("i")       // true
          )

        【讨论】:

        • 更正:String.prototype.slice 实际上返回一个字符串,因此不需要添加[0](尽管在这里无害。)
        【解决方案7】:

        这是在 JS 中递归检查回文的另一种方法:

        function isPalindrome(str){ if (str[0] === str[str.length - 1] && str.length > 1) { isPalindrome(str.substring(1, str.length -1)) return true }else{ return false } }

        【讨论】:

          【解决方案8】:

          你定义了isPalindrome() 来返回一个值,所以如果你自己调用它,递归或其他方式,你需要处理那个返回值。还有,你的if ... else逻辑太复杂了,简化一下:

          var isPalindrome = function(str) {
              if (str.length < 2) {
                  return true;
              }
          
              if (firstCharacter(str) == lastCharacter(str)) {
                  return isPalindrome(middleCharacters(str));
              }
          
              return false;
          };
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-16
            相关资源
            最近更新 更多