使用递归列表中元素的可能位置?

时间:2017-10-09 04:49:39

标签: scheme

任何人都可以告诉我们如何在列表中插入不同位置的元素,并使用only recursion将这些可能组合的列表作为列表返回?

例如,列表为(2 3),要插入的元素为1

输出:

list(
    list (1 2 3)
    list (2 1 3)
    list (2 3 1)
)

1 个答案:

答案 0 :(得分:1)

第一步是确定输出应该是什么样子,在这种情况下,它应该是一个列表列表 第二步通常是将问题分解为输入列表的情况。

空列表的情况非常简单 - 结果是包含一个单例列表的列表

(define (insert i ls)
    (if (null? ls)
        (list (list i))
        (...)))

对于非空列表的情况,检查预期结果的结构是有帮助的。

(insert 1 '(2 3)) 
-->
((1 2 3) (2 1 3) (2 3 1))

请注意,只有结果的第一个元素以1为第一个元素,我们可以使用(cons 1 '(2 3))轻松创建此元素。
其他元素都将输入列表的第一个元素作为它们的第一个元素,如果你查看它们的尾部(1 3)(3 1),你会发现它们是结果递归(insert 1 '(3))
遗漏的是您之后需要cons 2每个人{。}}。

现在我们有了所有必要的部分 - 总结

(define (insert i ls)
    (if (null? ls)
        (list (list i))
        (cons (cons i ls) (<...something...> (insert i (cdr ls))))))

我已离开&#34;&lt; ...某事......&gt;&#34;部分你要弄清楚。