Recursion Racket:递归地比较列表中的元素
这个函数应该获取一个列表(满是字符串或整数,这就是为什么它以“if”语句开头)并检查它是否按升序排列 我还没有弄清楚如何防止它崩溃,就像上次递归调用一样,“cadr”没有什么可利用的,因为“car”是最后一个元素Recursion Racket:递归地比较列表中的元素,recursion,scheme,racket,Recursion,Scheme,Racket,这个函数应该获取一个列表(满是字符串或整数,这就是为什么它以“if”语句开头)并检查它是否按升序排列 我还没有弄清楚如何防止它崩溃,就像上次递归调用一样,“cadr”没有什么可利用的,因为“car”是最后一个元素 (define (my-sorted? lst) (if (number? (car lst)) (if (< (car lst) (cadr lst)) (my-sorted? (rest lst)) #f)
(define (my-sorted? lst)
(if (number? (car lst))
(if (< (car lst) (cadr lst))
(my-sorted? (rest lst))
#f)
#f)
)
(定义(我的排序?lst)
(如果(编号)(车辆lst))
(如果(<(车辆lst)(cadr lst))
(我的分类?(剩余lst))
#(f)
#(f)
)
我知道排序函数存在,但是我需要递归地实现这个函数
感谢您的帮助。您应该尝试的两个最基本的列表是:
(my-sorted? '()) ; ==> #t (empty list is always sorted)
(my-sorted? '(1)) ; ==> #t (one element list is always sorted)
您当前的代码只是在其参数上执行了car
和cadr
,因此这两个测试将在不同级别失败
问题是如何比较一个数字和一些非数字的东西<代码>谢谢你的帮助。实际上,列表只能是字符串或整数-如果我不清楚的话,很抱歉。我需要满足的另一个条件是,如果列表确实包含字符串和int,那么我需要输出一个错误。因此,我的想法是分解函数来处理int(使用if(number?)行),然后让else条件处理字符串大小写。我试图找出我现在是否能够在racket中获得字符串的ASCII值,以便对字符串大小写进行比较。cond是否能够处理所有情况?@BrianJay因为您有相同类型的元素,所以可以一次性确定比较函数。请参阅我的编辑。
(cond
((not (number? (car lst))) #f)
((< (car lst) (cadr lst)) (my-sorted? (rest lst))
(else #f))
(define (my-sorted lst)
;; determine what comparison function to use, bind it to greater?
(define greater?
(if (and (pair? lst) (number? (car lst)))
>
string>?))
;; main recursive loop uses that one function
;; this can be done with define + call as well
(let loop ((lst lst))
(cond ((or (null? lst) (null? (cdr lst))) ...)
((greater? (car lst) (cadr lst)) ...)
(else (loop ...)))))