[英]Haskell using Higher-Order Functions to count how many items there are in a list
[英]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?
, rest
和first
对新的数据结构,只能empty?
允许使用ls-first
和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
用ls-rest
。 很简单!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.