2014-11-04 8 views
17

Jeśli mam to stała pascal zdefiniowany jakoIle oceniasz w trójkącie Pascala?

pascal :: [[Int]] 
pascal = iterate newrow [1] 
    where newrow = (zipWith (+) <*> tail) . ([0]++) . (++[0]) 

I ocenić pascal !! 50 !! 50 w GHCI, ile trójkąta robi to evaulate? Czy to lenistwo oznacza, że ​​obliczane są tylko niezbędne wartości (plus garść drobin)?

+1

tak - to stworzy Ci wszystkie łącznikami aż do '!! 50 !! 50' i oceń te, które są potrzebne do obliczenia tego wpisu. – Carsten

+7

W GHCi, spróbuj ': sprint pascal' po dokonaniu oceny konkretnej lokalizacji, np.' Pascal !! 50 !! 50' i możesz zobaczyć, co zostało ocenione, a co nie. – kosmikus

+2

@kosmikus +1 - powinieneś zrobić to odpowiedź! - Jeśli dodasz wyjście (lub zrzut ekranu), będzie to jeszcze bardziej imponujące - myślę o wydrukowaniu tego i powieszeniu go na mojej tablicy ("hej, co to jest?" - <> - ".... oh "): D – Carsten

Odpowiedz

25

Tak, obliczane są tylko te elementy, które są wymagane do obliczenia danego elementu.

GHCi oferuje komendy debugowania :sprint i :print, które mogą dostarczyć informacji o tym, które części wartości zostały już ocenione.

Na tym przykładzie:

GHCi> :sprint pascal 
pascal = _ 

(To dlatego, że nic nie zostało ocenione w tym momencie, a łącznikami są pokazane jako _.)

GHCi> pascal !! 5 !! 5 
1 

(nie używam 50 bo wtedy ten przykład stałby się zbyt długi.)

GHCi> :sprint pascal 
pascal = [1] : [_,1] : [_,_,1] : [_,_,_,1] : [_,_,_,_,1] : 
     (_ : _ : _ : _ : _ : 1 : _) : _ 

Teraz masz całkiem jasny pomysł, na które części zostały spojrzane.

Spróbujmy jeszcze jeden:

GHCi> pascal !! 5 !! 4 
5 
GHCi> :sprint pascal 
pascal = [1] : [1,1] : [_,2,1] : [_,_,3,1] : [_,_,_,4,1] : 
     (_ : _ : _ : _ : 5 : 1 : _) : _ 

a drugi:

GHCi> pascal !! 10 !! 5 
252 
GHCi> :sprint pascal 
pascal = [1] : [1,1] : [1,2,1] : [1,3,3,1] : [1,4,6,4,1] : 
     (1 : 5 : 10 : 10 : 5 : 1 : _) : 
     (_ : 6 : 15 : 20 : 15 : 6 : _) : 
     (_ : _ : 21 : 35 : 35 : 21 : _) : 
     (_ : _ : _ : 56 : 70 : 56 : _) : 
     (_ : _ : _ : _ : 126 : 126 : _) : 
     (_ : _ : _ : _ : _ : 252 : _) : _