wiki:SplitListsRecursivly

Version 1 (modified by Enrico Schwass, 9 months ago) ( diff )

--

This code takes a list of lists and splits it into separate groups whenever a sublist starts with the specified symbol. Each group is then added to the result. The result is a list of these grouped sublists.

To solve this problem in Scheme recursively, let's define a recursive function that will process the list of lists and split them into groups whenever a sublist starts with the specified symbol.

### Steps:

  1. Base Case: If the list of lists is empty, return an empty list.
  2. Recursive Case:
    • If the first sublist starts with the given symbol and the current group is not empty, start a new group.
    • Otherwise, continue adding sublists to the current group.

### Scheme Implementation:

Here’s how you can implement this in Scheme:

(define (split-list-of-lists list-of-lists symbol)
  (define (split-helper lists current-group result)
    (cond
      ((null? lists) 
       (if (null? current-group) 
           result
           (append result (list current-group))))
      ((equal? (caar lists) symbol)
       (if (null? current-group)
           (split-helper (cdr lists) (list (car lists)) result)
           (split-helper (cdr lists) (list (car lists)) (append result (list current-group)))))
      (else
       (split-helper (cdr lists) (append current-group (list (car lists))) result))))
  (split-helper list-of-lists '() '()))

;; Example usage:
(define list-of-lists 
  '((a 1 2 3)
    (b 4 5 6)
    (* 7 8 9)
    (c 10 11)
    (* 12 13)
    (d 14 15 16)))

(define symbol '*)

(split-list-of-lists list-of-lists symbol)

### Explanation:

  1. split-list-of-lists: The main function that initializes the recursive process with an empty current-group and result.
  1. split-helper:
    • Base Case: When lists is empty, if current-group is also empty, return the result. Otherwise, append the current-group to the result.
    • When symbol is encountered: If the current group is not empty, append it to the result and start a new group. If the current group is empty, simply start a new group with the current sublist.
    • Else case: Append the current sublist to the current-group and continue the recursion.

### Example Output: Running the above code with the example list-of-lists and symbol, you should get:

'(((a 1 2 3) (b 4 5 6)) 
  ((* 7 8 9) (c 10 11)) 
  ((* 12 13) (d 14 15 16)))

This Scheme code recursively processes the list of lists and splits them into groups based on the given symbol.

Note: See TracWiki for help on using the wiki.