Haskell:带数组参数的递归
免责声明:我是Haskell的新手,我对大学里的FP不太记得了,所以我的代码中可能有一两个以上的错误。这也是我的Euler问题3的代码 我尝试递归调用一个函数,其中两个数组作为参数,一个数组作为结果 目标是:Haskell:带数组参数的递归,haskell,recursion,Haskell,Recursion,免责声明:我是Haskell的新手,我对大学里的FP不太记得了,所以我的代码中可能有一两个以上的错误。这也是我的Euler问题3的代码 我尝试递归调用一个函数,其中两个数组作为参数,一个数组作为结果 目标是: 假设这个问题的n是10 创建从1到n的所有自然数的列表(变量为'allNumbers'为代码) 创建从1到n的所有自然数的另一个列表(变量为'allFactors'为代码) 取“allFactors”中的第一个元素,将“allFactors”的其余数字乘以该数字。(这将生成一个数字数组)
- 假设这个问题的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中做到这一点(已经有一段时间了)。谢谢你的反馈。我重新编写了我的代码,我认为它更好。