Отказ от ответственности: я новичок в Haskell, и я не очень много помню о FP из университета, поэтому в моем коде может быть более одной или двух ошибок. Это также мой код для проблемы Эйлера 3.Haskell: рекурсия с аргументами массива
Я пытаюсь рекурсивно вызывать функцию с двумя массивами в качестве аргументов и массивом в результате.
Цель:
- предположить п 10 на этот вопрос
- создать список всех натуральных чисел от 1 до п (переменная «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.
Мой вопрос: почему это не работает так, как я ожидал бы это? Я бы ожидал, что рекурсивный стек попадет в пустое состояние массива и просто вернет пустой массив, который не будет удален из вызывающего массива, и он будет продолжать возвращать только простые числа?
Спасибо за отзыв. то, что я хочу, это все простые факторы «n». Я попробовал другой алгоритм в python. Итак, я не совсем уверен, как это сделать в haskell (его было время) – cbrulak
Спасибо за отзыв. Я переписал свой код, и я думаю, что это лучше. – cbrulak