gpt4 book ai didi

functional-programming - (Racket) 返回满足条件的列表的子列表

转载 作者:行者123 更新时间:2023-12-04 08:47:11 24 4
gpt4 key购买 nike

我在编写一个返回满足条件的对子列表的函数时遇到问题。
当前代码:

(define lst1 '((a . 8)(b . 3)(c . 1)(d . 9)(e . 4)))

(define (letter t)
(caar t))

(define (numb p)
(cdar p))

(define (satisfy? c? lst)
(cond
[(or (c? (letter lst)) (c? (numb lst))) #t]
[else #f]))

(define (find-sublist c? lst)
(cond
[(satisfy? c? lst) (cons (car lst) (find-sublist c?(cdr lst)))]
[else (find-sublist c? (cdr lst))]))
控制台输入:
(find-sublist (lambda(x) (> (numb x) 3)) lst1)
想要的输出:
'((a . 8)(d . 9)(e . 4))
我当前的输入包括违反 cons 或 pair 的契约(Contract)
car: contract violation   
expected: pair?
given: '()

cdar: contract violation
expected: (cons/c pair? any/c)
given: 'a

最佳答案

您的代码有几个问题:

  • letternumb过程对列表元素进行操作,而不是对列表进行操作,因此它们应该只是 carcdr .
  • 你忘记了基本情况,当列表为空时会发生什么?
  • 不要放()附近lst ,这不是程序。
  • 更重要的是:您的 satisfy?程序尝试对字母 or 进行操作在号码上,但在 lambda你已经提取了号码。解决方案只是摆脱这个过程(或者,不要提取 lambda 中的数字,但是在应用条件之前,您必须测试 lambda 的参数是否是数字。 )

  • 这应该可以解决以下问题:
    (define (letter t)
    (car t))

    (define (numb p)
    (cdr p))

    (define (find-sublist c? lst)
    (cond
    [(null? lst) '()]
    [(c? (car lst)) (cons (car lst) (find-sublist c? (cdr lst)))]
    [else (find-sublist c? (cdr lst))]))
    它按预期工作:
    (define lst1 '((a . 8) (b . 3) (c . 1) (d . 9) (e . 4)))
    (find-sublist (lambda (x) (> (numb x) 3)) lst1)
    => '((a . 8) (d . 9) (e . 4))
    仅供引用,您重新实现了内置 filter程序。您应该尽可能使用现有程序;)
    (filter (lambda (x) (> (numb x) 3)) lst1)
    => '((a . 8) (d . 9) (e . 4))

    关于functional-programming - (Racket) 返回满足条件的列表的子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64252650/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com