我如何用递归的方式写我的函数?



如何以递归方式编写函数?我在我的learnJS书中找到了这个任务,仍然不能弄清楚为什么我应该这样做。

btw函数检查polindrome

function clean(str) {
return str.toLowerCase().replace('ё', 'е').replace('ъ', 'ь').replace(/[^ws]|_/g, "").trim().replace(/s+/g, " ");
}
function checkPalindrome(str) {
let cleanStr = clean(str);
for (let i = 0; i < cleanStr.length / 2; i++) {
if (cleanStr[i] !== cleanStr[cleanStr.length - 1 - i]) {
return false;
}
}
return true;
}

我不打算为你写代码,但我会给你一些伪代码逻辑,你可以用它们来理解递归。

function(input)
Check if input string length is less than or equal to 1 (explained below)
if it is then return true
Check if first and last characters are the same
if they are, strip the first and last characters off, pass this new string
to your function again, and return the result
if they are not, return false

让我们看一个例子。

示例1(偶数长度)输入字符串为anna。您的代码检查字符串长度,它不是<=1,所以它在函数中继续。
第一个和最后一个字符相同。我们去掉它们,并再次将nn传递到函数中(这是递归)。注意,第一个调用还没有返回。
函数检查输入字符串nn的长度,仍然是>1,所以继续。它检查第一个和最后一个字符是否匹配,去掉它们,然后用空字符串再次调用函数。
现在我们进入函数的第三次调用。这有点像《盗梦空间》。在第三次调用时,这个空白字符串<=1长度,所以返回true。
第二个函数调用返回第三个函数的值(true)。
第一个函数调用返回第二个函数的值(true),这样就完成了!

例2(奇数长度)现在更快,让我们看一个5个字母的回文civic
第一个调用比较开始/结束c,并继续。
第二个调用比较开始/结束i,然后继续。
第三个调用正在检查v是否为回文。长度小于或等于到1,并返回true!

示例3(无效)和无效的回文dead.
第一次调用比较开始/结束d并继续。
第二次调用比较起始/结束ea并返回false.第一个调用返回第二个调用的值(false),它是一个无效的回文。

最后的感想

你需要考虑是否/如何处理空格(例如可能删除所有空格,Noel sees Leon)和大写字母(可能将整个句子转换为小写)。更复杂的是标点符号/非英语字符,但考虑到这是一个教程练习,这可能超出了问题的范围。

最新更新