【发布时间】:2017-04-26 21:50:56
【问题描述】:
我目前正在完成我在大学学习的科目(编程语言理论)的作业。该任务的一部分包括解决使用命令式/结构化方法相对简单的问题;当一个人使用函数式语言(例如,矩阵乘法)时,这并不是那么微不足道。
所以,我们有 10 个问题要解决,我们可以使用任何函数式语言(或者至少是支持函数式编程的编程语言)。所以,虽然我对 Haskell 和 Miranda 非常熟悉,但我是在自学如何在 Julia 中编程,因此我选择它作为这份工作的编程语言。
我必须解决的一个问题是创建一个程序,给定一个字符串“S”作为输入,如果该字符串包含任何回文且其长度大于(或等于)的子字符串,则返回“true” 3.
所以,我使用了一种“暴力递归”的方法:测试输入字符串S是否为回文,如果是则返回true,否则递归检查是否S 没有第一个字符或没有最后一个字符是回文。如果有 没有大于等于3的回文子串,返回false
这将创建一个递归树来检查 S 中所有可能的子字符串。即使这个算法是指数的,它也能完成工作。 另外,我不能使用动态编程、分而治之、记忆化、高效的数据结构或任何“dank algorithm design technix”——所以,我必须坚持使用纯函数式递归方法.
代码如下:
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 也不会停止。它会一直运行,直到找到递归基本情况。
那么,发生了什么?我只是笨,看不到错误还是语言有问题?
【问题讨论】:
-
在
SubPalin通过第一个else分支时考虑它的返回值。 -
两行:第1行:
palindromeChecker(S) = all(reverse(collect(S)).==collect(S)) -
第 2 行:
SubPalin(S) = length(S)>2 && ( palindromeChecker(S) || SubPalin(S[2:end]) || SubPalin(S[1:end-1]) )
标签: recursion functional-programming return julia