Drracket中的递归

时间:2016-11-09 03:25:41

标签: recursion racket

我被要求编写一个使用长度为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 - 复制功能

使用包含列表缩写的初学者

谢谢。

2 个答案:

答案 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")