簡體   English   中英

Racket:檢查列表中是否有列表

[英]Racket: Check if there is a list in a list

這是我在這里的第一個問題::)

我需要一個 function 來檢查列表中是否有列表。 當列表中有一個列表時,它應該給出 false 。 我嘗試了簡單的事情,例如:

(define (list-inside-list? ls)

(if (or (list? (first ls)) (list? (rest ls))) false true))

我可能需要 lambda 但我只是不知道怎么做? 非常感謝您的幫助!

  • 空列表中沒有列表。
  • 否則,如果列表中存在列表
    • 它的第一個元素是一個列表,
    • 或者如果列表的 rest 內有列表。

訣竅是把它變成代碼,特別努力地思考如何表達最后一種情況:要做到這一點,你可能想寫一個 function 來確定列表中是否有一個列表......好吧,你的 function 是什么'正在寫作嗎?

熱烈歡迎 StackOverflow。

我沒有進行大量測試,但也許這種方法可以幫助您:

(check-expect (contains-no-sublist? (list )) #true)
(check-expect (contains-no-sublist? (list "red" "green" "blue")) #true)
(check-expect (contains-no-sublist? (list (list "light red" "dark red") "green" "blue")) #false)
;; contains-no-sublist? checks if any element in the list is a list itself and returns #false, if it finds a list in the list (nested list).
(define contains-no-sublist? ;; define a function with the name "contains-no-sublist?"
  (lambda [L] ;; define the function as a lambda expression over a given input list L
    (cond ;; the function returns either #t or #f
      [(empty? L) #true] ;; an empty list doesn't contain a sublist, so #t = #true can be returned
      [(cons? L) ;; else still a list is given
          (cond
            [(list? (first L)) #false] ;; either the first element of the list is a list itself, then return false.
            [else (contains-no-sublist? (rest L))] ;; or the first element is not a list itself, then check for the rest of the list if it contains any sublist
          )
       ]
    )
  )
)

使用cond

#lang racket
(define (no-list-inside?-by-cond ls)
  (cond
    [(empty? ls) #t]
    [(list? (first ls))
     #f]
    [else
     (no-list-inside?-by-cond (rest ls))]))

;;; TEST
(no-list-inside?-by-cond '(1 2 3)) ; should be #t
(no-list-inside?-by-cond '(1 2 3 '(3) 4)) ; should be #f
(no-list-inside?-by-cond '(1 2 3 '() 5)) ; should be #f

使用andmap

#lang racket
(define (no-list-inside?-by-andmap ls)
  (andmap (lambda (x) (not (list? x))) ls))

;;; TEST
(no-list-inside?-by-andmap '(1 2 3 2)) ; should be #t
(no-list-inside?-by-andmap '(1 2 3 '(3) 4)) ; should be #f
(no-list-inside?-by-andmap '(1 2 3 '() 5)) ; should be #f

使用filter

#lang racket
(define (no-list-inside?-by-filter lst)
  (empty? (filter list? lst)))

;;; TEST
(no-list-inside?-by-filter '(1 2 3)) ; should be #t
(no-list-inside?-by-filter '(1 2 3 '(3) 4)) ; should be #f
(no-list-inside?-by-filter '(1 2 3 '() 5)) ; should be #f

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM