Отказ от ответственности: я новичок в Haskell и не очень хорошо помню FP из университета, поэтому в моем коде может быть более одной или двух ошибок. Это также мой код для задачи Эйлера 3.
Я пытаюсь рекурсивно вызвать функцию с двумя массивами в качестве аргументов и массивом в результате.
Цель:
- предположим, что n = 10 для этого вопроса
- создать список всех натуральных чисел от 1 до n (переменная 'allNumbers' - это код)
- создать еще один список всех натуральных чисел от 1 до n (переменная 'allFactors' это код)
- взять первый элемент в 'allFactors' и умножить оставшиеся числа 'allFactors' на это число. (генерируется массив чисел)
- удалить все эти номера из 'allNumbers'
- переходить от 1 к n, пока 'allFactors' не станет пустым.
Вот мой код:
mkList :: Int -> [Int]
mkList n = [1..n-1]
modArray :: Int -> Int -> [Int]
modArray a b = [ x*b | x <- [1..a], x `mod` b == 0]
modArrayAll :: [Int] -> [Int] -> [Int]
modArrayAll [] [] = []
modArrayAll (x:xs) (y:ys) = (e)
where
m = head( ys)
n = length( xs)
e = (modArrayAll xs ys ) \\ modArray n m
(в основном)
let allNumbers = mkList (first + 1)
let allFactors = mkList (first + 1)
let mainList2 = modArrayAll allNumbers allFactors
Это приводит к пустому списку. Однако, если у меня есть:
e = xs \\ modArray n m --WORKS for one iteration
Я получаю все нечетные числа от 1 до 10.
Мой вопрос: почему это не работает так, как я ожидал? Я ожидал бы, что рекурсивный стек достигнет условия пустого массива и просто вернет пустой массив, который не будет удален из вызывающего массива, и он продолжит возвращать только простые числа?