как создать рекурсивный список ракеток, который из списка ввода выводит его уменьшение до 1 для каждого элемента в списке (например, ('3 2) выводит (' 32121) - PullRequest
0 голосов
/ 19 марта 2020

**** То, что я пытался ****

(define(help num)
        (if(= num 1)
           num
          (cons(num (help( - num 1))))))

; я назвал это определение в нижнем

(define (list-expand L)
(cond
  [(empty? L)'()]
  [(=(car L)1)(cons(car L)(list-expand (cdr L)))]
  [(>(car L)1) (cons(help(car L)(list-expand(cdr L))))])) 

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Просто для удовольствия - нерекурсивное решение в Racket:

(append-map (lambda (n) (stream->list (in-range n 0 -1))) '(3 2))

;; or:
(append-map (lambda (n) (for/list ((x (in-range n 0 -1))) x)) '(3 2))

Возвращение:

'(3 2 1 2 1)
0 голосов
/ 19 марта 2020

В процедуре help базовый случай неверен - если выходные данные являются списком, вы должны вернуть список. И на рекурсивном шаге num не является процедурой, поэтому она не должна быть заключена в квадратные скобки:

(define (help num)
  (if (<= num 0)
      '()
      (cons num (help (- num 1)))))

И в list-expand оба рекурсивных шага неверны. Вам просто нужно проверить, пуст ли список или нет, вызывая help с правильным количеством параметров; используйте append для объединения результатов, потому что мы объединяем подсписки вместе:

(define (list-expand L)
  (if (empty? L)
      '()
      (append (help (car L)) (list-expand (cdr L)))))

Это должно работать как ожидалось, но, пожалуйста, потратьте некоторое время на изучение синтаксиса Схемы, у вас все еще есть проблемы с основами, для случай, когда и где использовать скобки ...

(list-expand '(3 2))
=> '(3 2 1 2 1)
...