我正在为项目重新创建一些基本的球拍功能。
为此,我需要定义一个带有比较参数和列表的函数,并检查列表是否基于该参数排序。我显然不能只使用“排序?”。这是我到目前为止的内容:
(define (my-sorted? lst)
(λ (x)
(cond ((null? lst) #t)
((eq? (length lst) 1) #t)
((x (car (cdr lst)) (car lst))
(my-sorted? (cdr lst)))
(else #f))))
我认为我没有正确使用比较功能,有什么帮助吗?一个标准的输出应该是这样的:
(my-sorted? < '(2 5 6 9))
#t
虽然我在使用它,但是我在使用稍微不同的功能时也遇到了麻烦。这个决定通过的比较是否是列表的成员,有点类似。这是我得到的:
(define (is-member? lst x)
(cond
[(empty? list) false]
[(= (car list) x) true] ;here is the error i think
[else (is-member? (rest list) x)]))
对于解决这些问题的任何帮助或指导,我们深表感谢,我似乎无法摆脱这些错误。
答案 0 :(得分:0)
您的第一个函数返回一个函数:
(define (my-sorted? lst)
; one expression, a function is returned
(λ (x)
(cond ((null? lst) #t)
((eq? (length lst) 1) #t)
((x (car (cdr lst)) (car lst))
(my-sorted? (cdr lst)))
(else #f))))
此问题是您的递归还返回了需要以相同方式应用的函数。因此,当您的函数被提供给比较器时,它将运行一个步骤并返回需要新比较器的函数。您可以通过使用以前的值来解决此问题:
(define (my-sorted? lst)
(λ (x)
(cond ((null? lst) #t)
((eq? (length lst) 1) #t)
((x (car (cdr lst)) (car lst))
((my-sorted? (cdr lst)) x)) ; apply returned function with x
(else #f))))
或将其分开:
(define (my-sorted? lst)
(λ (x)
(define (helper lst) ; keep the recursion away from the contract
(cond ((null? lst) #t)
((eq? (length lst) 1) #t)
((x (car (cdr lst)) (car lst))
(helper? (cdr lst)))
(else #f)))
(helper lst)))
在第二个函数中,您使用list
就像它是一个值而不是一个函数。 list
是一个库函数,它返回其参数列表。您无法对函数执行car
。您还没有使用列表参数lst
,所以我想您正在混合使用这两个参数?
答案 1 :(得分:0)
如果要调用这样的函数
(my-sorted? < '(2 5 6 9))
#t
您必须使参数列表看起来像它-您需要一个运算符<
和一个列表作为参数。
(define (my-sorted? operator lst)
(cond ((or (null? lst)
(= (length lst) 1))
#t)
((operator (first lst) (second lst))
(my-sorted? operator (rest lst)))
(else #f)))
您的第二个问题的根源是您怀疑的一行中的错字:
list
是函数的名称。然后将其更正为lst
您的函数arguments变量,然后它可以工作。
目前,您的is-member?
仅适用于数字列表,因为相等性测试器=
仅适用于数字。
考虑eql
,equal
和其他相等性测试...