Я новичок в схеме и у меня возникли проблемы с отладкой моего кода.
; returns number of elements in a list
(define (length L)
(cond ((null? L) 0)
(else (+ (length (cdr L)) 1))))
; split the list in half:
; returns ((first half)(second half))
(define (split L)
(cond
((= (length L) 0) (list L L) )
((= (length L) 1) (list L '() ))
(else
(list (sublist L 1 (/ (length L) 2) 1)
(sublist L (+ (/ (length L) 2) 1) (length L) 1)))))
; extract elements start to end into a list
(define (sublist L start end counter)
(cond ((null? L) L)
((< counter start) (sublist (cdr L) start end (+ counter 1)))
((> counter end) '())
(else (cons (car L) (sublist (cdr L) start end (+ counter 1))))))
Мне кажется, что это разделит один список на два подсписка. Возможно, есть более простой способ сделать это, и поэтому я прошу прощения, если это кажется громоздким.
В любом случае, результаты:
Expected: (split '(1 2 3 4 5)) = ('(1 2) '(3 4 5))
Actual: (split '(1 2 3 4 5)) = ('(1 2) '(4 5))
Понятно, что length
или split
теряет среднее значение, но я проверял его снова и снова, и оно, похоже, теряет среднее значение. Кажется, что простым решением было бы избавиться от (+ 1)
от (+ (/ (length L) 2) 1)
, но мне это кажется нелогичным, как:
Assume L = '(1 2 3 4 5), (/ (length L) 2) = 2, and (+ (/ (length L) 2) 1) = 3
(sublist L 1 (2) 1) = '(1 2)
(sublist L (3) 5 1) = '(3 4 5)
** I put parens around the 2 and 3 to indicate that they were length calculations.
Очевидно, что мое предположение неверно или я упускаю из виду что-то тривиальное.
Заранее спасибо!