Программирование схемы, прохождение списка и создание всего внутри списка

Домашнее задание:

(diginlist '(4 5 3 2 8)) должен вернуться (4(5(3)2)8)

(define(removelast L)
  (if(null?(cdr L)) '()
     (cons(car L) removelast(cdr L))))

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

(define(diginlist L)
  (cond((null? L) '())
       ((list?(car L)) ((diginlist(car L))
                           (list(diginlist(cdr L)))))
       (else(append(list(diginlist(cdr L)))))))

(diginlist '(4 5 3 2 8))

возвращает:

(list (list (list (list (list '())))))

Я знаю, что должен включить removelast и last, но у меня проблемы с этим.

1 ответ

Вы должны научиться мыслить рекурсивно. Учитывая случай проблемы P, цель состоит в том, чтобы построить меньший экземпляр проблемы R так, чтобы решение R можно было легко "дополнить", чтобы построить решение для P.

Как только проблема разложена таким образом, вы можете решить R с помощью рекурсивного вызова той же процедуры, которая предназначена для решения P.

В этом случае, чтобы "listify" (4 5 3 2 8), Тогда что такое R? Хорошо, если бы мы могли прослушать (5 3 2) чтобы получить (5 (3) 2)тогда мы были бы в хорошей форме. Нам нужно только расширить это решение, сделав его вторым элементом в списке из 3 элементов, где первый элемент равен 4, а последний - 8.

Базовые случаи - когда ввод пуст или имеет ровно один элемент. В этих случаях мы хотим вернуть ввод.

Собираем это вместе как псевдокод:

 function listify (lst)
   if lst has 0 or 1 elements, return lst
   otherwise
     split lst into 3 parts:
       F = first element of lst
       M = a copy of lst except with first and last elements omitted
       L = last element of lst
     return a list of 3 elements: (F (listify M) L)

Теперь выразите это на схеме. У вас есть кое-что из этого сделано.

Другие вопросы по тегам