2013-03-04 3 views
2

Как бы я идти о создании функции секционирования, что бы взять номер и список разделить список на меньшие списки списков, размер которых определяется числом так чтоРазбиение списка на схеме

Partition 3 '(a b c d e f g h) -> '((a b c) (d e f) (g h)) and etc. using take and drop? 

ответ

2

Я дам вам несколько советов, чтобы вы могли найти ответ самостоятельно. Заполняющая пробелы:

(define (partition n lst) 
    (cond (<???>      ; if the list is empty 
     <???>)      ; then return the empty list 
     ((< <???> n)    ; if the lists' length is less than n 
     <???>)      ; return a list with lst as its only element 
     (else      ; otherwise 
     (cons      ; cons a list with the result of 
      (<???> lst n)    ; grabbing the first n elements of lst with 
      (<???> n     ; the result of advancing the recursion and 
       (<???> lst n)))))) ; removing the first n elements of lst 

Очевидно, что вы должны будете использовать take и drop где-то в растворе, как это предусмотрено в описании проблемы. Проверьте свое решение следующим образом:

(partition 3 '(a b c d e f g h)) 
=> '((a b c) (d e f) (g h)) 

(partition 3 '(a b c d e f g h i)) 
=>'((a b c) (d e f) (g h i)) 
+0

Большое вам спасибо! Я заполнил пробелы в нем, и я получаю (конд ((пусто? LST) LST ((<(длина LST) п) LST) (еще (минусы (взять LST п) (раздел п (drop lst n)))))) , но когда я это делаю (раздел 3 '(abcdefgh)), я получаю ((abc) (def) gh), поэтому его отсутствует скобка перед g и мне было интересно, что я сделал неправильно, чтобы я мог сделать это »((abc) (def) (gh)) вместо (.... gh). Является ли моя функция drop или take неправильно написана, что приводит к тому, что (пришлось написать мой собственный take & drop) – user1869703

+0

@ user1869703 заметить, что во втором случае вы должны вернуть «список с lst как единственный элемент». Другими словами, это: '(list lst)' –

+1

О, ладно, спасибо за вашу помощь. – user1869703