[英]Racket: Compare elements in list recursively
这个函数应该接受一个列表(充满字符串或整数,这就是它以“if”语句开头的原因)并检查它是否按升序排列。
我一直无法弄清楚如何防止它崩溃,因为在最后一次递归调用中,“cadr”没有什么可提取的,因为“car”是最后一个元素。
(define (my-sorted? lst)
(if (number? (car lst))
(if (< (car lst) (cadr lst))
(my-sorted? (rest lst))
#f)
#f)
)
我知道 sorted 函数存在,但是我需要递归地实现这个函数。
谢谢你的帮助。
您应该尝试的两个最基本的列表是:
(my-sorted? '()) ; ==> #t (empty list is always sorted)
(my-sorted? '(1)) ; ==> #t (one element list is always sorted)
您当前的代码只是根据其参数执行car
和cadr
,因此这两个测试将在不同级别失败。
那里是如何比较一个数字和一些不是数字的东西。 <
期望两个参数都是数字,但您的列表可以是字符串和数字。 "x"
和7
哪个更小? 你不能做(< 7 "x")
。
if
您可能会考虑cond
,而不是嵌套if
这是 if-elseif-else 的 lisps 方式。 基本上你可以用cond
做你的代码,如下所示:
(cond
((not (number? (car lst))) #f)
((< (car lst) (cadr lst)) (my-sorted? (rest lst))
(else #f))
编辑
由于列表应该将所有元素作为字符串或全部作为数字,您只需通过查看第一个元素来确定比较函数,并使用命名的let
递归,并基于第一个元素重用那个。
(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 ...)))))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.