我被要求编写一个使用长度为n的字符串s的racket函数repeat-str,并生成一个长度为n的新列表。如果n为0,则生成空列表。如果n大于0,则列表中的第一个字符串包含n个n个副本,第二个字符串为n-1,因此为第四个。
例如:(repeat-str "cat") => (list "catcatcat" "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个单独的列表,然后将它们全部附加到最后。
**不能使用:
- 占位符功能
- lambda
- 复制功能
使用包含列表缩写的初学者
谢谢。
答案 0 :(得分:0)
这是一种方式:
(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)))
答案 1 :(得分:0)
还可以将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")