繁体   English   中英

Racket:递归比较列表中的元素

[英]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)

您当前的代码只是根据其参数执行carcadr ,因此这两个测试将在不同级别失败。

那里是如何比较一个数字和一些不是数字的东西。 <期望两个参数都是数字,但您的列表可以是字符串和数字。 "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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM