List 如何制作一个递归的球拍列表,从输入列表中,列表中的每个元素输出其递减为1(例如,';3 2)输出(';32121)

List 如何制作一个递归的球拍列表,从输入列表中,列表中的每个元素输出其递减为1(例如,';3 2)输出(';32121),list,recursion,racket,List,Recursion,Racket,****我试过的**** (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

****我试过的****

(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))))])) 

help
过程中,基本大小写不正确-如果输出是列表,则必须返回列表。在递归步骤中,
num
不是过程,因此不能用括号括起来:

(define (help num)
  (if (<= num 0)
      '()
      (cons num (help (- num 1)))))
这应该可以像预期的那样工作,但请花一些时间研究Scheme的语法,您仍然有一些基本问题,例如,何时何地使用括号

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

只是为了好玩-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)
'(3 2 1 2 1)