2015-02-09 70 views
0

嗯......當爲任何大於3的整數求值時,爲什麼函數以無限循環結束?遞歸Haskell函數中的無限循環

smallestMultiple n = factors [2..n] where 
factors [] = [] 
factors (h:xs) = h:(factors $ filter ((<)1) [div x h|x<-xs]) 
    where 
     div x y 
      |x `mod` y ==0 = x `div` y 
      |otherwise = x 

回答

5

看來,主要的問題是,你定義的div本地版本:

div x y 
    | x `mod` y == 0 = x `div` y 
    | otherwise = x 

由於where條款綁定(以及在let)是遞歸的,右邊的div第一種情況的手邊是指您正在定義的div!你可以通過使用不同的名稱來解決這個問題,比如div'

div' x y 
    | x `mod` y == 0 = x `div` y 
    | otherwise = x 
+0

哦....這很有道理。謝謝 – Julio 2015-02-09 20:32:30