【发布时间】:2017-05-03 00:41:26
【问题描述】:
我必须编写一个接受两个数字的函数:
placeOneBlock 1 5
["feeee", "efeee", "eefee", "eeefe", "eeeef"]
所以它用 n * "f"-s 和 m-n * "e"-s 对 m 长列表进行了每一次排列。如果 n > 1,则“f”-s 应该像这样留在一组中:
placeOneBlock 3 10
["fffeeeeeee", "efffeeeeee", "eefffeeeee", "eeefffeeee", "eeeefffeee", "eeeeefffee", "eeeeeefffe", "eeeeeeefff"]
我写了这个函数:
placeOneBlock n m = permutations (replicate n 'f' ++ replicate (m-n) 'e')
但这将“e”-s 视为独特的元素,因此产生的排列比我需要的多得多,如果 n > 1 也不起作用。我该怎么做?
【问题讨论】:
-
将此视为列表的“排列”会使您的事情变得更加困难,因为您不想排列任何东西。相反,试着把它想象成一个做出非确定性选择的函数,在 Es 流中的 N 个位置中选择一个来放置 Fs 块。不确定性由可能的结果列表很好地建模,因此您最好编写一个使用该列表并生成一个列表作为输出的递归函数。
标签: haskell combinations permutation