【问题标题】:How can I write this recursive Haskell function如何编写这个递归 Haskell 函数
【发布时间】:2016-08-13 16:19:37
【问题描述】:

任务:

编写一个递归 Haskell 函数,它得到 2 个有序列表,该函数决定每个元素是否相等(如果其中一个相同,则函数值为 False)。

例如:

  • myfunction [1..5] [6..10] == True
  • myfunction [1..5] [5..10] == False

我无法使用elem 功能。 我可以使用递归和区分大小写的选择。

函数类型:

myfunction :: Ord a => [a] -> [a] -> Bool

我尝试过这样的事情:

myfunction :: Ord a => [a] -> [a] -> Bool
myfunction [] list = True
myfunction list [] = True
myfunction (x:xs) (y:ys)
    | x == y = False
    | xs == myfunction ???????? = False

但它不起作用......

【问题讨论】:

  • 您知道您从不使用< 函数,提示将断言只有x 在第二个列表中(或不在),然后对所有其他@987654329 递归执行此操作@
  • 你最后一行的逻辑是什么?什么是disjoint,它从何而来,为什么只需要单独考虑第二个列表?
  • 我编辑了它,它不是脱节的,对不起。我不知道这就是我寻求帮助的逻辑。
  • 请提供以下之一:编译代码并解释您不理解其行为的哪一部分,或在帖子中提供确切代码时编译器给出的错误消息以及您为什么不理解'不理解编译器错误。这篇文章不包含其中任何一个。
  • 好吧,如果你不知道逻辑那你为什么要写最后一行?你想在那个时候发生什么?想一想,这条线是你问题的核心。

标签: function haskell recursion


【解决方案1】:

(这个答案实际上只是您已经在答案表单中收到的 cmets。)您可以按如下方式实现它:

myFunction [] _ = True
myFunction _ [] = True
myFunction (x : xs) (y : ys) = case compare x y of
  LT -> myFunction xs (y : ys)
  EQ -> False
  GT -> myFunction (x : xs) ys

这是因为如果x 小于yx 也比ys 中的任何元素都小(因此不相等,这是我们真正想知道的)。这意味着我们可以忽略它并检查其余的列表。当x 大于y 时,则相反。

【讨论】:

  • 我们可以假设每个参数都包含唯一的值吗?这在问题中似乎并不明确。
  • @chepner:它应该可以工作。 (除非我遗漏了什么。)
  • 我可能误解了这个问题。在我看来,目标是检测两个参数之间的任何重复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 2013-04-21
相关资源
最近更新 更多