将递归转换为列表理解 [英] Convert recursion into list comprehension

查看:69
本文介绍了将递归转换为列表理解的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个功能:

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 ]

这依赖于(_:_) <- listlist为空时什么也不生成,而不是引发运行时错误.

This relies on (_:_) <- list generating nothing when list is empty, rather than throwing a runtime error.

这篇关于将递归转换为列表理解的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆