我的問題是如何準備在初學者方案中,我如何將一個變量表示爲一個字符串?
代碼說明:(5個astericks 4,然後3然後2然後1)。到目前爲止,我有:
(define (triangle n)
(cond
[(zero? n) empty]
[else (cons n (triangle (sub1 n)))]))
但這隻給我(list 5 4 3 2 1)
。請注意,這隻使用方案初學者名單和縮寫的基礎。謝謝!
我的問題是如何準備在初學者方案中,我如何將一個變量表示爲一個字符串?
代碼說明:(5個astericks 4,然後3然後2然後1)。到目前爲止,我有:
(define (triangle n)
(cond
[(zero? n) empty]
[else (cons n (triangle (sub1 n)))]))
但這隻給我(list 5 4 3 2 1)
。請注意,這隻使用方案初學者名單和縮寫的基礎。謝謝!
它總是在簡單,更短的子部件拆分複雜問題的好方法。在這種情況下,我們可以簡化先寫解決方案,子問題的通用解決方案,如:
"*****"
或"****"
或列表的過程...或"*"
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
如果你在它仔細看,這兩個程序共享完全相同的結構。在基本情況下返回的值(空列表和空字符串)以及用於將部分答案(cons
和string-append
)粘合在一起的過程發生了什麼變化。
如果您只是在尋找如何將數字轉換爲字符串,您可以使用(number->string x)
。
但是,由於您希望將數字表示爲星號,所以最好將它們保留爲數字,直到您構建一串星號。在這種情況下,你可能想的方法,如:
(define (num-to-asterisks x)
(make-string x #\*))
我該如何處理?謝謝! – 2013-03-10 21:54:02
@JamesLalonde更新。 – Tushar 2013-03-10 21:56:18
當我試圖運行它來測試x爲1時,它給了我一個字符串追加的錯誤代碼期望一個字符串,但取而代之的是一個列表 – 2013-03-10 22:03:21
嘗試這種情況:
(define (triangle n)
(let building ((i 0) (r '()))
(if (= i n)
r
(building (+ i 1)
(cons (string-append "*" (if (null? r) "" (car r)))
r)))))
這是很好的尾遞歸;通過將「*」添加到結果列表的第一個元素來建立結果列表。
感謝您的幫助!到目前爲止,我已經解決了這兩個部分,但現在我在如何合併重複以便代碼可以從(列表5 4 3 2 1)變爲(列出星號) – 2013-03-10 22:14:49
中繪製了一個空白代碼中存在錯誤張貼在問題中。你不能這樣做:'(cons n(triangle(sub1 n))',這將返回一個數字列表。而不是'n',用正確的參數調用幫助程序 – 2013-03-10 22:17:06
我試圖將其更正爲(0(num-to-stars n))empty] [else(cons(num-to-stars n(triangle(sub1 n))))])(012) ) 但它給我一個錯誤,說它期望1但得到2個參數 – 2013-03-10 22:20:03