【问题标题】:Functional "All except one"功能性“除一个之外的所有”
【发布时间】:2013-01-10 11:34:39
【问题描述】:

如何声明接受数字和数字列表的函数,如果列表中没有这样的数字,则返回 NONE,否则返回列表选项(Haskell 中的“可能”)没有这个数字?如果有多个这样的数字,函数必须删除其中的第一个。

all_except_one : 'a * 'a list -> 'a list option

我不知道该怎么做:\ 我问任何语言的任何代码,只是一些关于函数式算法的提示(最初我必须在 SML 中解决这个问题)。我也不能在我的任务中使用高阶函数。

【问题讨论】:

  • 你违反了荣誉准则

标签: algorithm functional-programming sml


【解决方案1】:

这个解决方案怎么样?

fun all_except_one(s, lst) =
    let
        fun helper e =
            case e of
                ([], _) => NONE
               |(x::xs, acc) => if x = s
                                then SOME (acc @ xs)
                                else helper(xs, x :: acc)
    in helper(lst, []) end

没有辅助函数也没有尾递归。

fun all_except_one (_, []) = NONE
  | all_except_one (s, x::xs) = if x = s
                                then SOME xs
                                else case all_except_one(s, xs) of
                                           NONE => NONE
                                         | SOME ys => SOME (x::ys)

【讨论】:

  • 丹克,就是这个! PS:你好/proglang/!
【解决方案2】:

怎么样(Haskell 语法):

allbutone n xs
    | n `elem` xs = Just (filter (!=n) xs)
    | otherwise   = Nothing

【讨论】:

  • 谢谢,但您的函数会删除所有此类元素,而正确的函数必须仅删除第一个元素。我也不能在我的任务中使用高阶函数。
  • @vortexxx192 这是因为你的规范是矛盾的,你说“否则返回列表选项(Haskell 中的'Maybe')没有这个数字”,然后,只有第一个实例应该被删除。一个人不可能在所有情况下都满足,因此我选择了第一个选项。
猜你喜欢
  • 2013-07-25
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多