【问题标题】:Asking about ML recursive function询问ML递归函数
【发布时间】:2012-09-19 21:47:24
【问题描述】:

我一直在使用 ml 函数,但遇到了一些烦人的事情。

我会用简单的代码来解释它。 例如,如果有一个 list(int*int) 并且我想检查是否有一些元组的第一个元素包含 3。

L = [(1,2),(2,3),(3,5),(3,4)]

所以在这个列表中,我想得到 5 和 4。 但是,在 ML 中,函数是递归的,所以如果我这样写代码。

fun a(list) = 
    if #1(hd(list)) = 3 then #2(hd(list))
    else a(tl(list))

在这个简单的函数中,它可以得到 5 但不能得到 4,因为一旦检测到 (3,5) 满足条件,它就会返回 5 并且函数结束。

有什么方法可以同时获得 4 吗?

【问题讨论】:

    标签: sml ml


    【解决方案1】:

    您忘记在条件成立的列表尾部递归调用该函数。

    在 ML 中,您几乎从不使用 hdtl,而是使用模式匹配。您可以对元组进行模式匹配以提高可读性:

    fun filter [] = []
      | filter ((x, y)::xys) = if x = 3 
                               then y::(filter xys)
                               else filter xys
    

    如果您想使用它们,List structure 上的高阶函数是另一种选择。

    【讨论】:

      【解决方案2】:

      我不知道 ml 但基本上你需要这样做而不是做其他事情:

      fun a(list) =
        if list = nil then nil 
        else
          if #1(hd(list)) = 3
          then 
            #2(hd(list)) :: a(tl(list))
          else 
            a(tl(list))
      

      (随着我对 ML 的了解越来越多,我正在逐步编辑此回复:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-27
        • 2014-12-03
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        • 2015-03-01
        相关资源
        最近更新 更多