将复杂问题拆分为更简单、更短的子部分总是一个好主意。在这种情况下,我们可以通过首先编写子问题的解决方案来简化通用解决方案,如下所示:
- 首先,构建一个创建字符串列表的过程,其中字符串是
"*****"
or"****"
或 ... or"*"
- 其次,编写一个
repeat
帮助程序,给定一个字符串和一个数字,重复该字符串多次 - 例如:(repeat "*" 3)
将返回"***"
很容易看出如何用第二个子问题来表达第一个子问题。因为这看起来像一个家庭作业,所以你不应该在这里要求完整的解决方案。自己来回答对你来说会更有用,这里是大意,填空:
(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
)粘在一起的过程。