2017-04-02 63 views
1

下面的代碼在某些情況下給我一個堆棧溢出錯誤(例如hosum (\x->x `mod` 3) 1000),我不明白爲什麼。任何人都可以向我解釋這個嗎? (我是Haskell的新手,我很感激任何幫助:))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 

回答

3

堆棧溢出很可能是由無限遞歸造成的。你的衛兵是和n <= m;對於每個nm,其中一個總是如此。您的otherwise永遠不會到達,遞歸永不終止。你的意思可能是你的後衛是m < nn < 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 0; otherwise捕獲那一個。

+0

好的,我明白了。非常感謝你:) –

+0

我第二次刪除'hs f 0 0'的情況。看起來很有趣,作爲一個基本的例子,當每個遞歸調用中'n,m'增加_(增加1)。 – chi