Haskell:带数组参数的递归

Haskell:带数组参数的递归,haskell,recursion,Haskell,Recursion,免责声明:我是Haskell的新手,我对大学里的FP不太记得了,所以我的代码中可能有一两个以上的错误。这也是我的Euler问题3的代码 我尝试递归调用一个函数,其中两个数组作为参数,一个数组作为结果 目标是: 假设这个问题的n是10 创建从1到n的所有自然数的列表(变量为'allNumbers'为代码) 创建从1到n的所有自然数的另一个列表(变量为'allFactors'为代码) 取“allFactors”中的第一个元素,将“allFactors”的其余数字乘以该数字。(这将生成一个数字数组)

免责声明:我是Haskell的新手,我对大学里的FP不太记得了,所以我的代码中可能有一两个以上的错误。这也是我的Euler问题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
这将导致一个空列表。但是,如果我有:

e = xs \\ modArray n m  --WORKS for one iteration
我得到了从1到10的所有奇数


我的问题是:为什么这不符合我的预期?我希望递归堆栈会遇到空数组条件,只返回一个空数组,而这个空数组不会从调用数组中删除,它会继续只返回素数

modArray n m
创建一个多个
m
的列表,然后将其从整数的“主列表”中删除。但是
modArray n m
包含
1*m
,因此每个数字都被删除,因为它是自身的“倍数”。在您的测试用例中,您只得到奇数作为结果,而您希望2仍然在结果列表中。此外,1包含在因子列表中,这将消除所有数字,因为它们都是1的倍数

递归的终止情况是
modArrayAll[][]=[]
,因此返回一个空列表。然后在周围的递归调用中,此处使用此返回值:

(modArrayAll xs ys) \\ modArray n m

这将尝试从由
modArrayAll xs ys
返回的已空列表中删除更多元素(由
modArray n m
返回的元素)。不会在任何位置添加新元素,结果列表保持为空。使用您的算法,您希望
[]
-案例返回整个数字列表,而不是空列表。然后,周围递归函数调用中的
\\modArray n m
可以过滤掉越来越多的非素数因子。

modArray n m
创建一个
m
的倍数列表,然后将其从整数的“主列表”中删除。但是
modArray n m
包含
1*m
,因此每个数字都被删除,因为它是自身的“倍数”。在您的测试用例中,您只得到奇数作为结果,而您希望2仍然在结果列表中。此外,1包含在因子列表中,这将消除所有数字,因为它们都是1的倍数

递归的终止情况是
modArrayAll[][]=[]
,因此返回一个空列表。然后在周围的递归调用中,此处使用此返回值:

(modArrayAll xs ys) \\ modArray n m

这将尝试从由
modArrayAll xs ys
返回的已空列表中删除更多元素(由
modArray n m
返回的元素)。不会在任何位置添加新元素,结果列表保持为空。使用您的算法,您希望
[]
-案例返回整个数字列表,而不是空列表。然后,周围递归函数调用中的
\\modArray n m
可以过滤掉越来越多的非素数因素。

我复制了您的目标注释:

-- assume n is 10 for this question
n=10

-- create a list of all natural numbers from 1 to n (variable is 'allNumbers' is code)
allNumbers = [1..n]

-- create another list of all natural numbers from 1 to n (variable is 'allFactors' is code)
allFactors = [2..n] -- i suspect you really wanted this rather than [1..n]

-- take the first element in 'allFactors' and
-- multiply the rest of the numbers of 'allFactors' by this number.
-- (this generates an array of numbers)
-- continue from 1 to n until 'allFactors' is empty
factorProducts = [ x*y | x <- allFactors, y <- allFactors]

--  remove all these numbers from 'allNumbers'
whatYouWanted = allNumbers \\ factorProducts
——假设这个问题的n是10
n=10
--创建从1到n的所有自然数的列表(变量为'allNumbers'为代码)
所有数字=[1..n]
--创建从1到n的所有自然数的另一个列表(变量为'allFactors'为代码)
allFactors=[2..n]--我想你真的想要这个而不是[1..n]
--以“allFactors”中的第一个元素为例
--将“所有因素”的其余数字乘以该数字。
--(这将生成一个数字数组)
--继续从1到n,直到“allFactors”为空

factorProducts=[x*y | x我复制了你的目标笔记:

-- assume n is 10 for this question
n=10

-- create a list of all natural numbers from 1 to n (variable is 'allNumbers' is code)
allNumbers = [1..n]

-- create another list of all natural numbers from 1 to n (variable is 'allFactors' is code)
allFactors = [2..n] -- i suspect you really wanted this rather than [1..n]

-- take the first element in 'allFactors' and
-- multiply the rest of the numbers of 'allFactors' by this number.
-- (this generates an array of numbers)
-- continue from 1 to n until 'allFactors' is empty
factorProducts = [ x*y | x <- allFactors, y <- allFactors]

--  remove all these numbers from 'allNumbers'
whatYouWanted = allNumbers \\ factorProducts
——假设这个问题的n是10
n=10
--创建从1到n的所有自然数的列表(变量为'allNumbers'为代码)
所有数字=[1..n]
--创建从1到n的所有自然数的另一个列表(变量为'allFactors'为代码)
allFactors=[2..n]--我想你真的想要这个而不是[1..n]
--以“allFactors”中的第一个元素为例
--将“所有因素”的其余数字乘以该数字。
--(这将生成一个数字数组)
--继续从1到n,直到“allFactors”为空

factorProducts=[x*y | x感谢您的反馈。我想要的是'n'的所有素因子。我在python中尝试了不同的算法。因此,我不完全确定如何在haskell中实现这一点(已经有一段时间了)谢谢你的反馈。我重新编写了我的代码,我认为它更好。谢谢你的反馈。我想要的是“n”的所有基本因子。我在python中尝试了不同的算法。因此,我不完全确定如何在haskell中做到这一点(已经有一段时间了)。谢谢你的反馈。我重新编写了我的代码,我认为它更好。