我目前正在分配一门我正在大学里学习的课程(编程语言理论)。这项任务的一部分在于解决问题,虽然使用命令式/结构化方法相对简单易于解决;当使用函数式语言(例如,矩阵乘法)时,并不是那么微不足道。
因此,我们有10个问题需要解决,我们可以使用任何函数语言(或者至少是一种支持函数式编程的编程语言)。所以,虽然我对Haskell和Miranda非常熟悉,但我自己学习如何在Julia中编程,因此我选择它作为这项工作的编程语言。
我必须解决的一个问题是创建一个程序,如果字符串“S”作为输入,如果字符串包含任何子回合并且其长度大于(或等于)的子串,则返回“true” 3.
所以,我使用了“强力递归”方法:测试输入字符串 S 是否是回文,如果是,则返回true,否则递归检查 S 没有它的第一个字符或没有它的最后一个字符是回文。如果有的话 no palindrome substring大于或等于3,返回false
这将创建一个递归树,检查S中所有可能的子串。即使这个算法是指数的,它也可以完成工作。 此外,我不能使用动态编程,分而治之,记忆,高效的数据结构或任何“ dank算法设计技术” - 所以,我必须坚持纯粹的功能,递归方法。
以下是代码:
function SubPalin(S)
if length(S) > 2
if palindromeChecker(S) == true
return true
else
SubPalin(S[2:end])
SubPalin(S[1:end-1])
end
else
return false
end
end
注意:palindromeChecker是一个检查子串是否是回文的函数(是的,很明显,我知道)
问题是:当此代码执行检查所有可能的大于3的子串时,它在找到回文子串时不会停止。甚至奇怪的是,经过一些测试,我发现代码即使返回true也不会停止。它一直持续到发现递归基础为止。
那么,发生了什么?我只是愚蠢而且我看不到这个错误或该语言出了什么问题?
答案 0 :(得分:2)
你可能想在你的第一个分支中考虑这样的代码行?
return SubPalin(S[2:end]) || SubPalin(S[1:end-1])