1

我在 Scheme 中实现这个程序时遇到了一些麻烦,尽管我认为我已经完成了 90% 的工作。不幸的是,我需要对此有点模糊,因为这是一项家庭作业。

我需要将一个列表作为输入,生成列表的所有可能子序列,并返回符合某个条件的 ONE。我已经完成了生成列表的所有子序列并判断某个子集是否是解决方案的代码。但是,我无法让 Scheme 返回该解决方案。我的代码现在基本上看起来像这样

(define (function rest_of_list subsequence)
    (if (subsequence is a solution) subsequence)
    (if (> (length rest_of_list) 0) (function (cdr rest_of_list) (append subsequence (car rest_of_list))))
    (if (> (length rest_of_list) 0) (function (cdr rest_of_list) subsequence)))

这段代码应该做的是对列表中的每个元素,它在两个方向上递归分支。在一个方向上,它将 (car rest_of_list) 添加到子序列中并继续沿列表向下。在另一个方向上,它忽略 (car rest_of_list) 并继续沿着列表向下。一旦它找到一个可接受的子序列,它就会返回它,这就是函数调用的结果。现在我只是得到空白输出。我有点理解我猜的原因,但还不足以解决这个问题。

4

1 回答 1

1

如果不查看您的实现的确切细节,这有点棘手,但我会按照以下方式做一些事情:

(define (function rest_of_list subsequence)
  (cond ((null? rest_of_list)
         '())
        ((subsequence is a solution)
         subsequence)
        (else
         (combine (function (cdr rest_of_list) (append subsequence (car rest_of_list)))
                  (function (cdr rest_of_list) subsequence)))))

有趣的部分是你们combine两个分支的方式,它可以像cons. 另请注意,可能缺少基本情况:如果列表的其余部分为空会发生什么?

于 2012-11-09T15:59:47.987 回答