DrRacket - 使用最小的内置函数在列表中创建列表

时间:2018-04-09 18:16:20

标签: list scheme racket

我需要一个可以执行此操作的功能:

奇数长度列表 输入'(1 2 3 4 5)='(1(2(3)4)5)

甚至长度列表 输入'(1 2 3 4)='(1(2()3)4)

它需要使用非常小的内置函数。我花了好几个小时试图解决这个问题,此时我完全没有想法。

这就是我所拥有的:

(define (listInList L)
    (define length (listLength L))     
    (define L2 (listInListHelper length L '() '()))
    (define L3 (listInListHelper (- length 2) L L2 '()))
    L3
)

(define (listInListHelper N L NL)
(cond
    ((= N 0) '()
    ((= N 1) (cons (list (car L)) NL))
    (else (cons (cons (car L) (list (lastItem L))) NL)
    (remove 1 L)))     
)
)

(define (lastItem L)
(if (null? (cdr L))(car L)
    (lastItem (cdr L)))
)

(define (remove N L)
(cond ((eq? N 0) (cdr L))
    (else (cons (car L) (remove (- N 1)(cdr L))))))

1 个答案:

答案 0 :(得分:1)

这是一种方法,你需要告诉我它是否足够小:

(define (f lst)
  (define (helper lst rlst half)
    (cond
      ((= half 0 )  null)
      ((= half 1/2) (list (car lst)))
      (else         (list (car lst)
                          (helper (cdr lst) (cdr rlst) (sub1 half))
                          (car rlst)))))
  (helper lst (reverse lst) (/ (length lst) 2)))

测试:

> (f '(1 2 3 4 5))
'(1 (2 (3) 4) 5)
> (f '(1 2 3 4))
'(1 (2 () 3) 4)