如何解决使用 if 条件尝试解决“回文”挑战的递归函数出错
所以我正在做这个流行的挑战“回文”,我从“前端大师”Javascript系列复制了这个解决方案,我得到了不同的输出。我想知道是否有什么变化或者我错过了什么。这是我关于 StackOverflow 的第一个问题,因为这只是 MindF***k。
这是怎么回事?
'use strict'
function isPalindrome(str) {
if (str.length <= 1) return true;
var first = str[0];
var last = str[str.length - 1];
if (first === last) {
console.log(str.substring(1,str.length - 1))
isPalindrome(str.substring(1,str.length - 1));
}
return false;
}
console.log(isPalindrome("abcdcba")) // Return false on my machine
我在 RunJS 应用程序和 VScode 终端上尝试了这个,我还在文件上运行了 Node。
保持返回错误!!
解决方法
函数将返回true
当且仅当输入的长度为<= 1
:
if (str.length <= 1) return true;
它不是:
isPalindrome("abcdcba")
函数中唯一的其他 return
语句是:
return false;
看起来您想要返回递归结果:
return isPalindrome(str.substring(1,str.length - 1));
否则函数永远不会对递归调用自身的结果做任何事情,并且只是默认在最后一行返回 false
。
我修复了你的代码...
'use strict'
function isPalindrome(str) {
if (str.length <= 1) return true;
var first = str[0];
var last = str[str.length - 1];
if (first === last) {
console.log(str.substring(1,str.length - 1))
return isPalindrome(str.substring(1,str.length - 1));
}else return false;
}
console.log(isPalindrome("abcdcba")) //
我看到递归函数有两个不同的部分:
- 当函数开始调用自身并堆叠函数调用时前进。
- 当所有堆栈函数开始返回值时,以相反的方式向后返回。在您的示例中,此阶段刚好在
if (str.length <= 1) return true
或if first !== last
之后开始。
我认为你在前进中做得完全正确,但在回来时有一些小细节。你需要记住,你有你的解决方案,你需要通过所有调用返回值到初始调用。
递归函数被一分为二:
function recursive{
//forward processing
..
resultValue = recursive()
..
// backward processing if needed
return kindOfResultValue //resultValue or a transformation if needed
}
注意: Remember to check all conditional branches of your recursive function to return always a value after calling itself
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。