【问题标题】:Infinite loop in haskell programhaskell程序中的无限循环
【发布时间】:2017-04-03 03:35:32
【问题描述】:

以下代码在某些情况下(例如 hosum (\x->x `mod` 3) 1000 )给我一个堆栈溢出错误,我不明白为什么。谁能给我解释一下? (我是 Haskell 的新手,如果有任何帮助,我将不胜感激 :))

 hosum :: (Int -> Int) ->  (Int -> Int)
    hosum f  = (\x -> hs f x (- x))
            where hs :: (Int -> Int) -> Int -> Int -> Int
                  hs f 0 0 = f 0
                  hs f n m
                          | m <= n 
                          = f m + hs f n (m+1)
                          | n <= m 
                          = f n + hs f (n+1) m
                          | otherwise
                          = 0

【问题讨论】:

    标签: haskell


    【解决方案1】:

    栈溢出很可能是无限递归造成的。你的守卫是m &lt;= nn &lt;= m;对于每个nm,其中之一总是正确的。你的otherwise 永远不会到达,递归永远不会终止。你的意思可能是你的警卫是m &lt; nn &lt; m

    因此您的hs 应该是

    hs f 0 0 = f 0
    hs f n m | m < n     = f m + hs f n (m + 1)
             | m > n     = f n + hs f (n + 1) m
             | otherwise = 0
    

    由于最后一个守卫,您甚至可以删除模式hs f 0 0otherwise 抓住了那个。

    【讨论】:

    • 哦,好的,我明白了。非常感谢:)
    • 我第二次删除 hs f 0 0 案例。作为基本情况,当n,m 在每个递归调用中增加(增加1)时,这看起来很有趣。
    猜你喜欢
    • 2013-10-05
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 2018-05-05
    • 2023-03-29
    • 2014-03-24
    • 2015-11-10
    相关资源
    最近更新 更多