【问题标题】:recursive function accepts list in scheme递归函数接受方案中的列表
【发布时间】:2013-08-04 10:09:57
【问题描述】:

我是 Scheme 的新手,这是我的第一个函数式语言。递归地实现几乎所有东西对我来说似乎很尴尬。然而,能够实现具有单个整数输入的阶乘和斐波那契问题的函数。

但是,当你的函数有一个列表的输入时呢?假设这个练习:

FUNCTION: ret10 - 提取所有大于 10 的数字并以列表形式返回 在给定列表中找到的,guile> (ret10 '(x e (h n) 1 23 12 o)) 输出:(23 12)

我应该将 (define c(list)) 作为我的函数的参数吗?还是有其他方法?

请帮忙。谢谢!


这是我根据 Óscar López 爵士在下面的回答得出的解决方案。希望这对其他人有所帮助:

(define (ret10 lst)
    (cond
        ((null? lst) '())

        ((and (number? (car lst)) (> (car lst) 10))
            (cons (car lst)
            (ret10 (cdr lst))))

        (else (ret10 (cdr lst)))
    )
)

【问题讨论】:

  • 哎呀。我的意思是大于 10。对此感到抱歉。已编辑。

标签: scheme


【解决方案1】:

这种问题,你接收一个列表作为输入并返回另一个列表作为输出,有一个众所周知的解决方案模板。我首先建议你看看The Little SchemerHow to Design Programs,这两本书都会教你开始思考解决方案的正确方法。

首先,我将向您展示如何解决一个类似的问题:完全按照原样复制列表。这将展示解决方案的一般结构:

(define (copy lst)
  (cond ((null? lst)                ; if the input list is empty
         '())                       ; then return the empty list
        (else                       ; otherwise create a new list
         (cons (car lst)            ; `cons` the first element
               (copy (cdr lst)))))) ; and advance recursion over rest of list

现在让我们看看上述内容与您的问题有何关系。显然,递归的基本情况是相同的。不同的是我们cons 第一个元素与列表的其余部分 如果它是一个数字(提示:使用number? 过程)并且它大于10。如果条件不成立,我们只是推进递归,而不做任何事情。以下是大体思路,请填空:

(define (ret10 lst)
  (cond (<???> <???>)          ; base case: empty list
        (<???>                 ; if the condition holds
         (cons <???>           ; `cons` first element
               (ret10 <???>))) ; and advance recursion
        (else                  ; otherwise
         (ret10 <???>))))      ; simply advance recursion

别忘了测试它:

(ret10 '(x e (h n) 1 23 12 o))
=> '(23 12)

最后一点:通常你会使用filter 过程来解决这个问题——它将一个列表作为输入并返回另一个列表作为输出,其中仅包含满足给定谓词的元素。在您学习并了解如何“手动”编写解决方案后,请查看 filter 并使用它编写解决方案,只是为了比较不同的方法。

【讨论】:

  • 哇哦!!!谢谢奥斯卡先生!你是最好的。感谢您让我自己发现代码,而不是立即破坏答案。呵呵。我更新了我的帖子以承担我提出的解决方案。我希望它会帮助别人!
  • @BurnzZ 永远是我的荣幸 :)
【解决方案2】:

解决列表的第一个元素和列表其余部分的递归问题。确保处理终止条件(列表为 null?)并合并结果(consappend 在下面)

(define (extract pred? list)
  (if (null? list)
      '()
      (let ((head (car list))
            (rest (cdr list)))
        (cond ((pred? head) (cons head (extract pred? rest)))
              ((list? head) (append (extract pred? head)
                                    (extract pred? rest)))
              (else (extract pred? rest))))))

(define (ret10 list)
  (extract (lambda (x) (and (number? x) (> x 10))) list))

> (ret10 '(0 11 (12 2) 13 3))
(11 12 13)

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 2013-09-22
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多