使用JavaScript进行递归回文检查

时间:2018-07-28 03:39:06

标签: javascript recursion palindrome

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

if let image = info[UIImagePickerControllerOriginalImage] as? UIImage{

}

确保递归调用有问题。我希望得到您的帮助。谢谢。我将附加我的代码的输出。

enter image description here

6 个答案:

答案 0 :(得分:4)

    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'));

答案 1 :(得分:3)

您已定义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 :(得分:3)

这是另一种递归回文。

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

答案 3 :(得分:0)

这是递归检查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)

使用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
  )

答案 5 :(得分:0)

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

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