LINUX.ORG.RU

Рекурсия


0

0

Думаю применить Haskell для решения одной задачки, но до сих пор меня беспокоит реализация в нем многих вещей с использованием рекурсии, тк неизвестно при обработке каких объемов данных полученная софтина выдаст segfault.

Мало того, меня очень удивляют следующие вещи - возьмем к примеру две функции:

getn 1 (h:t) = h

getn n (h:t) = getn (n - 1) t

getn1 1 l = head l

getn1 n l = getn1 (n-1) (tail l)

Так вот, getn 499000 [1..500000] выдает 499000, а getn1 499000 [1..500000] - Segmentation fault... Вопрос - ну почему???

Или косвенно рекурсивные функции проверки чет/нечет на ocaml - let rec pair n = (n<>1) && ((n=0) or (impair (n-1))) and impair n = (n<>0) && ((n=1) or (pair (n-1)));; - работают при любом n!..

Объясните дураку плиз.

★★

У ghc есть хорошая опция - -ddump-simpl. По его выводу ясно, что ни хрена не получается при развёртке шаблонов хвостовой рекурсии.

e2fsck
()

Да, ещё лучше это видно на -ddump-ds. Фишка в том, что список будет в контексте до самого конца, потому как шаблон разворачивается в функцию с внутренним циклом.

e2fsck
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.