【问题标题】:Returning one true value in Scheme在 Scheme 中返回一个真值
【发布时间】:2012-11-09 15:52:52
【问题描述】:

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

【问题讨论】:

    标签: scheme


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

    【讨论】:

    • 这绝对帮助我了解我做错了什么。看来我现在修好了。需要在递归的每一步明确定义哪个递归分支会导致一个有效的答案(或者如果两者都选一个),而不是像过程语言那样期望 Scheme 在某些返回 true 时立即返回。
    猜你喜欢
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2012-09-11
    • 2018-05-07
    • 2018-02-22
    相关资源
    最近更新 更多