Recursion Drracket中的递归

Recursion Drracket中的递归,recursion,racket,Recursion,Racket,我被要求编写一个racket函数repeat str,它使用长度为n的字符串s,并生成长度为n的新列表。如果n为0,则生成空列表。如果n大于0,列表中的第一个字符串包含n的n个副本,第二个将是n-1,因此第四个 例如:(重复str“cat”)=>(列出“catcat”“catcat”“cat”) 我所拥有的: (define (repeat-str s) (cond [(zero? (string-length s)) empty] [(equal? (string-len

我被要求编写一个racket函数repeat str,它使用长度为n的字符串s,并生成长度为n的新列表。如果n为0,则生成空列表。如果n大于0,列表中的第一个字符串包含n的n个副本,第二个将是n-1,因此第四个

例如:
(重复str“cat”)=>(列出“catcat”“catcat”“cat”)

我所拥有的:

(define (repeat-str s)
   (cond
    [(zero? (string-length s)) empty]
    [(equal? (string-length s) 1) s]
    [else (make-list (string-length s) s)
          (repeat-str (make-list (sub1 (string-length s)) s))]))
我试图调用函数以在第二个列表中获得n-1,但我不确定如何执行递归部分。这样我就可以得到3个单独的列表,然后将它们全部附加到末尾

**无法使用: -占位符函数
-兰姆达 -复制功能

使用带列表缩写的初学者

谢谢。

这里有一种方法:

(define (repeat-str str)
  (define (sub cnt rep)
    (if (zero? cnt)
        null
        (cons rep (sub (- cnt 1) (string-append rep str)))))
  (reverse (sub (string-length str) str)))

您还可以使用
for/list
和可用的内置功能:

(define (f s)
  (reverse
   (for/list ((i (string-length s)))
     (apply string-append (make-list (add1 i) s)))))
测试:

(f "cat")
输出:

'("catcatcat" "catcat" "cat")

创建一个helper函数,在其闭包中使用
s
n
作为参数,这样您就可以知道字符串中有多少个副本以及何时停止。那就用这个吧。