当前位置:  开发笔记 > 编程语言 > 正文

Haskell:使用数组参数进行递归

如何解决《Haskell:使用数组参数进行递归》经验,为你挑选了1个好方法。

免责声明:我是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得到所有奇数.

我的问题:为什么这不按我期望的方式工作?我希望递归堆栈会达到空数组条件并返回一个空数组,该数组不会从调用数组中删除,它会继续只返回素数?



1> porges..:

我复制了你的目标说明:

-- 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

目前你似乎还在思考一个相当强制性的思维模式.尝试更多地考虑你想要的东西,而不是如何得到它:)

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有