我现在很难理解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))))]))
答案 0 :(得分:2)
您必须记住,不能在新数据结构上使用cons?
,rest
和first
,而只能使用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
。很简单!