繁体   English   中英

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

[英]In Racket how do i find the length of a list using struct instead of just using only higher-order functions or recursion

我现在很难理解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))))]))

您必须记住您不能使用cons? restfirst对新的数据结构,只能empty? 允许使用ls-firstls-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)))]))

你看到发生了什么事吗? 我们只需要替换lengthls-length ,和restls-rest 很简单!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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