将递归转换为列表理解 [英] Convert recursion into list comprehension
本文介绍了将递归转换为列表理解的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有这个功能:
subsetsOfThree [] = []
subsetsOfThree [x,y,z] = [[x,y,z]]
subsetsOfThree fls@(x:y:z:xs) = ([x,y,z] : subsetsOfThree (xs)) ++
(subsetsOfThree (x:xs)) ++
(subsetsOfThree (y:xs)) ++
(subsetsOfThree (z:xs)) ++
(subsetsOfThree (x:y:xs)) ++
(subsetsOfThree (x:z:xs)) ++
(subsetsOfThree (y:z:xs))
subsetsOfThree _ = []
它只使用长度为3的子集,但是我尝试用等效的列表理解方法转换它,我尝试过:
And it take only the subsets of length 3, but I cannot get rid of converting it in equivalent list comprehension, I tryed:
subsetsOfThree [] = []
subsetsOfThree [x,y,z] = [[x,y,z]]
subsetsOfThree (x:y:z:xs) = [xs6 | xs1 <- subsetsOfThree xs,
xs2 <- [xs1, (x:xs)],
xs3 <- [xs2, (y:xs)],
xs4 <- [xs3, (z:xs)],
xs5 <- [xs4, (x:y:xs)],
xs6 <- [xs5, (y:z:xs)]
]
subsetsOfThree _ = []
但是它总是返回[]
任何线索都会受到赞赏
推荐答案
我认为您可能想利用tails
辅助函数:
I think you might want to exploit the tails
helper function:
subsetsOfThree ws = [ [x,y,z] | (x:xs) <- tails ws, (y:ys) <- tails xs, z <- ys ]
这依赖于(_:_) <- list
在list
为空时什么也不生成,而不是引发运行时错误.
This relies on (_:_) <- list
generating nothing when list
is empty, rather than throwing a runtime error.
这篇关于将递归转换为列表理解的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文