生成列表列表

时间:2015-11-28 00:17:45

标签: scheme

我正在尝试生成一个包含*的列表。 以下是我到目前为止的情况:

(define (position loc count)
  (cond [(empty? loc)empty]
    [else (cons (list (first loc) count)
                (position (rest loc) (add1 count)))]
    ))

所以:

(position (string->list "**.*.***..") 0) 

会产生:

(list
 (list #\* 0) (list #\* 1) (list #\. 2) (list #\* 3) (list #\. 4) (list #\* 5)     
 (list #\* 6) (list #\* 7) (list #\. 8) (list #\. 9))

基本上我想要

(list (list (list #\* 0) (list #\* 1))
      (list (list #\* 3))
      (list (list #\* 5)(list #\* 6) (list #\* 7)))

我考虑过使用foldr,但不确定这是否有效。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

虽然它并不完全是一个折叠解决方案,但您需要一个基于先前输入修改它的行为的功能,以便对连续的星形字符进行分组。检查我使用布尔值来查找匹配时切换行为。

(define (combine-continuous char L)
  (let loop ((L L) (acc '()) (continuing? #t))
    (cond ((null? L) (list (reverse acc)))
          ((equal? (caar L) char)
           (if continuing?
               (loop (cdr L) (cons (car L) acc) #t)
               (cons (reverse acc) 
                     (loop (cdr L) (list (car L)) #t))))
          (else (loop (cdr L) acc #f)))))

(combine-continuous #\* (position (string->list "**.*.***..") 0))
=->
;Value 19: (((#\* 0) (#\* 1)) ((#\* 3)) ((#\* 5) (#\* 6) (#\* 7)))