2017-04-02 2 views
1

Der folgende Code gibt mir in einigen Fällen einen Stapelüberlauffehler (ex hosum (\x->x `mod` 3) 1000) und ich verstehe nicht warum. Kann mir das jemand erklären? (Ich bin neu in Haskell und ich würde jede Hilfe dankbar :))Unendliche Schleife in Haskell-Programm

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 

Antwort

3

Der Stapelüberlauf wird durch die unendliche Rekursion wahrscheinlich verursacht. Ihre Wachen sind und n <= m; für jede n und m, eine davon ist immer wahr. Ihre otherwise wird nie erreicht, die Rekursion endet nie. Du hast wahrscheinlich gemeint, dass deine Wachen m < n und n < m sind.

Ihre hs daher

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 

Wegen dieser letzten der Hut sein sollte, könnten Sie sogar das Muster entfernen hs f 0 0; Die otherwise fängt das ein.

+0

oh ok, ich verstehe. Vielen Dank :) –

+0

Ich zweite Entfernen der 'hs f 0 0 'Fall. Es sieht witzig aus, dass "n, m" in jedem rekursiven Aufruf (um 1) als Basisfall ansteigt. – chi

Verwandte Themen