代码之家  ›  专栏  ›  技术社区  ›  Niaz Ahsan

用JavaScript进行递归回文检查

  •  3
  • Niaz Ahsan  · 技术社区  · 7 年前

    我试图通过使用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);
    

    当然递归调用有问题。我很想得到你的帮助。谢谢。我正在附加我的代码输出。

    enter image description here

    2 回复  |  直到 7 年前
        1
  •  4
  •   cdlane    7 年前

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

    var isPalindrome = function(str) {
        if (str.length < 2) {
            return true;
        }
    
        if (firstCharacter(str) == lastCharacter(str)) {
            return isPalindrome(middleCharacters(str));
        }
    
        return false;
    };
    
        2
  •  4
  •   Nitin .    6 年前
        const isPalindrome = str => {
        const strLen = str.length;
        if (strLen === 0 || strLen === 1) {
            return true;
        }
    
        if (str[0] === str[strLen - 1]) {
            return isPalindrome( str.slice(1, strLen - 1) );
        }
    
        return false;
    };
    
    console.log(isPalindrome('madam'));
    
        3
  •  0
  •   P_A_ Rivers    6 年前

    下面是递归检查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 } }

        4
  •  0
  •   Mulan    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 (右)使用索引检查字符串(而不是使用 ) -

    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
      )