2013-03-10 57 views

回答

4

它總是在簡單,更短的子部件拆分複雜問題的好方法。在這種情況下,我們可以簡化先寫解決方案,子問題的通用解決方案,如:

  1. 首先,建立創建的字符串,其中字符串是"*****""****"或列表的過程...或"*"
  2. 其次,寫給出一個字符串和一個數repeat助手程序,重複的字符串,很多時候 - 例如:(repeat "*" 3)將返回"***"

人們很容易看到的第一個子問題如何表達在t第二個。因爲這看起來像一個家庭作業,你不應該在這裏要求完整的解決方案。這將是更爲有用到自己達到了答案,這裏的總體思路,填充了空白:

(define (triangle n) 
    (cond [<???> <???>]     ; if n is zero return the empty list: '() 
     [else       ; otherwise 
     (cons <???>     ; cons n repetitions of * (using `repeat`) 
       (triangle <???>))])) ; and advance the recursion 

(define (repeat str n) 
    (cond [<???> <???>]     ; if n is zero return the empty string: "" 
     [else       ; otherwise 
     (string-append <???>   ; append the given string 
      (repeat <???> <???>))])) ; and advance the recursion 

如果你在它仔細看,這兩個程序共享完全相同的結構。在基本情況下返回的值(空列表和空字符串)以及用於將部分答案(consstring-append)粘合在一起的過程發生了什麼變化。

+0

感謝您的幫助!到目前爲止,我已經解決了這兩個部分,但現在我在如何合併重複以便代碼可以從(列表5 4 3 2 1)變爲(列出星號) – 2013-03-10 22:14:49

+0

中繪製了一個空白代碼中存在錯誤張貼在問題中。你不能這樣做:'(cons n(triangle(sub1 n))',這將返回一個數字列表。而不是'n',用正確的參數調用幫助程序 – 2013-03-10 22:17:06

+0

我試圖將其更正爲(0(num-to-stars n))empty] [else(cons(num-to-stars n(triangle(sub1 n))))])(012) ) 但它給我一個錯誤,說它期望1但得到2個參數 – 2013-03-10 22:20:03

1

如果您只是在尋找如何將數字轉換爲字符串,您可以使用(number->string x)

但是,由於您希望將數字表示爲星號,所以最好將它們保留爲數字,直到您構建一串星號。在這種情況下,你可能想的方法,如:

(define (num-to-asterisks x) 
     (make-string x #\*)) 
+0

我該如何處理?謝謝! – 2013-03-10 21:54:02

+0

@JamesLalonde更新。 – Tushar 2013-03-10 21:56:18

+0

當我試圖運行它來測試x爲1時,它給了我一個字符串追加的錯誤代碼期望一個字符串,但取而代之的是一個列表 – 2013-03-10 22:03:21

0

嘗試這種情況:

(define (triangle n) 
    (let building ((i 0) (r '())) 
    (if (= i n) 
     r 
     (building (+ i 1) 
        (cons (string-append "*" (if (null? r) "" (car r))) 
         r))))) 

這是很好的尾遞歸;通過將「*」添加到結果列表的第一個元素來建立結果列表。

相關問題