我在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)并继续向下列表。一旦找到可接受的子序列,它就会返回它,这是函数调用的结果。现在我得到空白输出。我有点理解为什么我猜,但还不足以解决这个问题。
答案 0 :(得分: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
一样简单。另请注意,可能缺少基本情况:如果列表的其余部分为空,会发生什么?