LINUX.ORG.RU

[haskell] покритикуйте программу

 


0

0

Только не спрашивайте, зачем она :-)

Задаётся натуральное число n. Если оно нечётное, то n = 3n+1, если оно чётное, то n = n/2. И так до тех пор, пока n ≠ 1.

Как результат интересны все промежуточные числа.

geblist :: [Integer] -> [Integer]
geblist (n:ns)
    | n == 1 = (n:ns)
    | otherwise = geblist (geb n : (n:ns))


geb :: Integer -> Integer
geb n
    | n == 1 = 1
    | odd n  = 3*n + 1
    | otherwise = n `div` 2

gebseq :: Integer -> [Integer]
gebseq n = reverse (geblist [n])

main = print (gebseq 27)

Вывод:

[27,82,41,124,62,31,94,47,142,71,214,107,322,161,484,242,121,364,182,91,274,137,412,206,103,310,155,466,233,700,350,175,526,263,790,395,1186,593,1780,890,445,1336,668,334,167,502,251,754,377,1132,566,283,850,425,1276,638,319,958,479,1438,719,2158,1079,3238,1619,4858,2429,7288,3644,1822,911,2734,1367,4102,2051,6154,3077,9232,4616,2308,1154,577,1732,866,433,1300,650,325,976,488,244,122,61,184,92,46,23,70,35,106,53,160,80,40,20,10,5,16,8,4,2,1]

☆☆

Последнее исправление: ip1981 (всего исправлений: 3)

Ответ на: комментарий от jtootf

> а твоя цель - сделать так, чтобы любая функция с подобным паттерном потенциально его запускала? мило

использовать [1..] для создания бесконечного цикла проще всего так:

main = print last [1..]

так что твои опасения идут лесом

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

Только не таким способом. Эта реализачия квадратична по времени. Такой матчинг (ns ++ [n]) будет требовать O(n). Надо отрывать у списка не хвост, а голову, это дешёвая операция

Например так:

reverse                 :: [a] -> [a]
reverse l =  rev l []
  where
    rev []     a = a
    rev (x:xs) a = rev xs (x:a)
#endif

Бессовествно спёрто из прелюдии GHC

Shimuuar
()
Ответ на: комментарий от www_linux_org_ru

main = print last [1..]

и? глядя на эту функцию, я могу сказать, что в ней не так. глядя на вызов some_function [1..] при наличии в ленивом языке желаемых тобой паттернов, я ничего не могу сказать. оно мне надо?

так что твои опасения идут лесом

опасения у меня есть исключительно в твоей вменяемости

jtootf ★★★★★
()
Ответ на: комментарий от www_linux_org_ru
> reverse [] = []
> reverse (nn++[n]) = n : reverse nn

Ну дык.

{-# LANGUAGE ViewPatterns #-}
data LastView a = Empty | [a] :. a
lastView [] = Empty
lastView [a] = [] :. a
lastView (a:as) = let bs :. b = lastView as in (a : bs) :. b
rev [] = []
rev (lastView -> as :. a) = a : rev as
Miguel ★★★★★
()
Ответ на: комментарий от ntp

Хаскель тут затем, что по каноническим преданиям свойства любой программы, записанной на Хаскеле доказываются автомагически.

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