ekalem
ekalem

Reputation: 25

Racket: Check if there is a list in a list

this is my first question here! :)

I need a function that checks if there is a list inside a list. It should give false when there is a list inside a list. I tried simple things like:

(define (list-inside-list? ls)

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

I probably need lambda but I just don't know how? Would appreciate a lot for help!

Upvotes: 0

Views: 849

Answers (3)

tjorchrt
tjorchrt

Reputation: 702

use 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

use 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

use 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

Upvotes: 0

ABC
ABC

Reputation: 199

a warm welcome to StackOverflow.

I haven't heavily tested, but maybe this approache helps you:

(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
          )
       ]
    )
  )
)

Upvotes: 0

user5920214
user5920214

Reputation:

  • There is no list inside the empty list.
  • Otherwise, there is a list inside a list if
    • its first element is a list,
    • or if there is a list inside the rest of the list.

The trick is then to turn this into code, thinking particularly hard about how to express the last case: to do it you might want to write a function which determines if there is a list inside a list ... well, what's the function you're writing do?

Upvotes: 2

Related Questions