簡體   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