2016-11-09 22 views
2

我被要求寫一個球拍函數repeat-str,使用長度爲n的字符串s,併產生一個長度爲n的新列表。如果n爲0,則會生成空列表。如果n大於0,則列表中的第一個字符串包含n個n的副本,第二個字符串將是n-1,因此是第四個。Drracket遞歸

例:(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個單獨的列表,然後在最後添加它們。

**不能使用: - 一個佔位符,函數
- 拉姆達 - 複製功能

使用初學者用列表的縮寫

謝謝。

+1

用's'作爲參數在''s'中做一個輔助函數,這樣你就知道字符串中有多少個拷貝以及何時停止。那就用那個吧。 – Sylwester

回答

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