Чтобы помочь мне изучить Haskell, я работаю над проблемами в Project Euler. После решения каждой проблемы я сверяю свое решение с вики-страницей Haskell, пытаясь изучить более эффективные методы кодирования. Вот решение проблемы 3 :
primes = 2 : filter ((==1) . length . primeFactors) [3,5..]
primeFactors n = factor n primes
where
factor n (p:ps)
| p*p > n = [n]
| n `mod` p == 0 = p : factor (n `div` p) (p:ps)
| otherwise = factor n ps
problem_3 = last (primeFactors 317584931803)
Мое наивное толкование состоит в том, что простые числа
определены в терминах primeFactors
, который определяется в терминах простых чисел
. Таким образом, оценка primeFactors 9
будет следовать такому процессу:
фактор 9 простых чисел
. простых чисел
для его первого элемента, который равен 2. простых чисел
для его следующего элемента. primeFactors 3
. простых чисел
для его первого элемента, который равен 2. простых чисел
для его следующего элемента. primeFactors 3
. Другими словами, шаги 2–4 будут повторяться бесконечно. Явно ошибаюсь, так как алгоритм завершается.Какую ошибку я здесь делаю?