使用 JavaScript 进行递归回文检查
Recursive palindrome check with JavaScript
我正在尝试使用 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);
递归调用肯定有问题。我很想得到你的帮助。谢谢。我附上了我的代码的输出。
您将 isPalindrome()
定义为 return 一个值,因此如果您自己以递归方式或其他方式调用它,则需要处理该 return 值。还有,你的if ... else
逻辑太复杂了,简化一下:
var isPalindrome = function(str) {
if (str.length < 2) {
return true;
}
if (firstCharacter(str) == lastCharacter(str)) {
return isPalindrome(middleCharacters(str));
}
return false;
};
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'));
这是在 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
}
}
使用 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
)
这是另一个递归回文。
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
这里有一个简单的答案。基本上我们是比较第一个字符和最后一个字符并相应地采取行动。
const isPalindrome = str => {
if (str.length <= 1) return true;
if (str[0] !== str[str.length - 1]) return false;
return isPalindrome(str.slice(1,-1))
}
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;
}
你可以使用递归
基本情况
我们有一个基本情况(简单情况),如果字符串是一个字符,我们就 return 为真。
如果它有两个字符,我们检查第一个字符是否与第二个字符相同,如果是,我们 return 为真。
递归大小写
如果超过两个字符,我们检查第一个和最后一个字符是否相同,如果不相同,我们简单地 return false
但如果它们相同,那么我们现在想对其他字符做同样的事情,所以我们用相同的字符串调用相同的函数,但删除第一个和最后一个字符,因为我们已经知道它们是相同的,我们保留直到我们达到基本情况。
希望有用
一些测试
isPalindrome('p') // true
isPalindrome('po') // false
isPalindrome('pp') // true
isPalindrome('pop') //true
这个解决方案怎么样?
function isPalindrome(str){
if (str.length > 3) return isPalindrome(str.substring(1, str.length-1));
return str[0] === str[str.length-1];
}
我正在尝试使用 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);
递归调用肯定有问题。我很想得到你的帮助。谢谢。我附上了我的代码的输出。
您将 isPalindrome()
定义为 return 一个值,因此如果您自己以递归方式或其他方式调用它,则需要处理该 return 值。还有,你的if ... else
逻辑太复杂了,简化一下:
var isPalindrome = function(str) {
if (str.length < 2) {
return true;
}
if (firstCharacter(str) == lastCharacter(str)) {
return isPalindrome(middleCharacters(str));
}
return false;
};
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'));
这是在 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
}
}
使用 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
)
这是另一个递归回文。
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
这里有一个简单的答案。基本上我们是比较第一个字符和最后一个字符并相应地采取行动。
const isPalindrome = str => {
if (str.length <= 1) return true;
if (str[0] !== str[str.length - 1]) return false;
return isPalindrome(str.slice(1,-1))
}
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;
}
你可以使用递归
基本情况
我们有一个基本情况(简单情况),如果字符串是一个字符,我们就 return 为真。
如果它有两个字符,我们检查第一个字符是否与第二个字符相同,如果是,我们 return 为真。
递归大小写
如果超过两个字符,我们检查第一个和最后一个字符是否相同,如果不相同,我们简单地 return false
但如果它们相同,那么我们现在想对其他字符做同样的事情,所以我们用相同的字符串调用相同的函数,但删除第一个和最后一个字符,因为我们已经知道它们是相同的,我们保留直到我们达到基本情况。
希望有用
一些测试
isPalindrome('p') // true
isPalindrome('po') // false
isPalindrome('pp') // true
isPalindrome('pop') //true
这个解决方案怎么样?
function isPalindrome(str){
if (str.length > 3) return isPalindrome(str.substring(1, str.length-1));
return str[0] === str[str.length-1];
}