![](/img/trans.png)
[英]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.