在Racket中,如何使用struct而不是仅使用高阶函数或递归来查找列表的长度

时间:2019-07-16 20:02:23

标签: list struct scheme racket

我现在很难理解Racket中的数据结构,所以我目前正在研究一个问题,我所要做的就是找到列表的长度。

我知道有很多方法可以使用递归,文件夹和映射来查找列表的长度,但是我现在正在尝试以特定的方式查找列表的长度。

这是问题的细节;

对于此问题,请使用以下数据定义:

(定义结构ls(第一部分))

;; Ls要么

;; '()或

;; (make-ls first rest),其中first是Int,rest是Ls。

请记住,由于该结构的名称为ls,并且其字段的名称分别为first和rest,因此您将使用ls-first和ls-rest访问这些字段。

这是问题

长度。编写一个使用Ls并返回其中值个数的函数(ls长度L)。

例如,(check-expect(ls-length(make-ls 5(make-ls 7(make-ls 11'()))))3)

这是找到长度的常用方法

(define (length lst)
  (cond
    [(empty? lst)  0]
    [(cons? lst)   (+ 1 (length (rest lst)))]))

但是我希望使用来解决问题

(define-struct ls (first rest))

到目前为止,这是我所拥有的,但是我知道这段代码似乎非常错误,不过我觉得我的基本情况应该是正确的。

(define (ls-length L)
  (cond
    [(empty? L) 0]
    [(cons? (ls-first (first L))) (+ 1 (length (rest (ls-rest))))]))

1 个答案:

答案 0 :(得分:2)

您必须记住,不能在新数据结构上使用cons?restfirst,而只能使用empty?ls-first和{允许使用{1}}。条件非常简单:列表为空或不为空,我们实际上不需要ls-rest。另外,在调用递归时要小心,该过程称为cons?,而不是ls-length

length

将以上内容与著名的(define (ls-length lst) (cond [(empty? lst) 0] [else (+ 1 (ls-length (ls-rest lst)))])) 实现进行比较:

length

你看到发生了什么事吗?我们仅需将(define (length lst) (cond [(empty? lst) 0] [else (+ 1 (length (rest lst)))])) 替换为length,并将ls-length替换为rest。很简单!