【问题标题】:a function written in Julia programming language doesn't stop on return用 Julia 编程语言编写的函数在返回时不会停止
【发布时间】: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


【解决方案1】:

您可能想在您的第一个 else 分支中考虑类似这行代码的内容? return SubPalin(S[2:end]) || SubPalin(S[1:end-1])

【讨论】:

  • 天哪,我真的那么笨。我只是忘记了当算法测试所有案例时我可以使用这个“或详尽”的定义。我什至在描述算法时都使用了它,哈哈。无论如何,为你 +1
猜你喜欢
  • 2021-03-28
  • 1970-01-01
  • 2010-10-25
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多