在Scheme中返回一个真值

时间:2012-11-09 15:52:52

标签: scheme

我在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)并继续向下列表。一旦找到可接受的子序列,它就会返回它,这是函数调用的结果。现在我得到空白输出。我有点理解为什么我猜,但还不足以解决这个问题。

1 个答案:

答案 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一样简单。另请注意,可能缺少基本情况:如果列表的其余部分为空,会发生什么?