目前,我有一个元素列表(1 2 1 2 2 0 0 1 0)。
我要编写的函数的要点是,它应该显示一种可能性,即连续显示3个相同的数字(这是“中标”的情况)。
我想要的输出是(1 2 1 2 2 2 0 1 0)。该函数在被调用时的格式为(display(next 2(list)))
我假设我会选择列表中的汽车,并且如果有办法存储/记住我所得到的汽车(以防我再次要求它,并想检查它是否匹配)。
最接近基本循环的是命名的let结构。这是一个适用于您的问题的简单实现:
(define (next e lst)
; l1 : part of the list already processed (reversed)
; l2 : part of the list still to be processed
; c-2: element before previous
; c-1: previous element
; res: result (list of winning cases
(let loop ((l1 null) (l2 lst) (c-2 null) (c-1 null) (res null))
(if (null? l2)
(reverse res)
(let ((ca (car l2)) (cd (cdr l2)))
(loop (cons ca l1) cd c-1 ca
(if (and (= ca 0) (= c-2 e) (= c-1 e))
(cons (append (reverse l1) (cons c-1 cd)) res) ; build winning case
res))))))
然后
> (next 2 '(1 2 1 2 2 0 0 1 0))
'((1 2 1 2 2 2 0 1 0))
> (next 2 '(1 2 1 2 2 0 2 2 0))
'((1 2 1 2 2 2 2 2 0) (1 2 1 2 2 0 2 2 2))
> (next 1 '(1 2 1 2 2 0 1 1 0))
'((1 2 1 2 2 0 1 1 1))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句