【发布时间】:2018-12-03 08:00:17
【问题描述】:
我想找到一个列表的所有可能的连续分区:
(a b c d) => (((a) (b c d)) ((a b) (c d)) ((a b c) (d)) ((a) (b c) (d)) ((a b c d)) ((a) (b) (c) (d)))
解决此问题的最简单方法是什么?理想情况下不使用计数器。
编辑:
这是我一直在尝试的一个示例,但它并不完全有效(它应该反过来给出答案,但没关系):
(define split-list-help
(lambda (l h a)
(begin
(display a)
(if
(null? (cdr l))
(list (cons (cons (car l) a) h))
(let
[(a-nosplit (cons (car l) a))
(h-split (if (null? a)
(cons (list (car l)) h)
(cons (list (car l)) (cons a h))))]
(append (split-list-help (cdr l) h-split '())
(split-list-help (cdr l) h a-nosplit)))))))
(split-list-help '(a b c) '() '())
我们的想法是我们逐项遍历列表,在每一步我们可以拆分或不拆分它,然后我们分支到两个新的迭代,一个有拆分,一个没有拆分。这会产生接近我想要但不完全的结果。
【问题讨论】:
-
您能解释一下为什么要对结果进行分组吗?
-
嗯,这些是将列表拆分为子列表的可能方法,不是吗?
-
我希望你有一个列表
((a) (a b) ...)insted 列表列表的列表列表的某些组合列表的列表。嵌套的目的是什么? -
这不会给我所有的拆分,但只有所有的子列表。我对可以将列表拆分为其子列表的所有方式都感兴趣。
标签: scheme minikanren