在初学者方案中,我如何将变量表示为字符串?

时间:2013-03-10 21:48:41

标签: scheme racket

我的问题是如何编码

(triangle 5) produces (list "*****" "****" "***" "**" "*")

注意:(5个星号4,然后3个,然后是2个,然后是1个)。到目前为止,我有:

(define (triangle n)
  (cond
    [(zero? n) empty]
    [else (cons n (triangle (sub1 n)))]))

但这只给了我(list 5 4 3 2 1)。请注意,这仅使用方案初学者列表和缩写的基础。谢谢!

3 个答案:

答案 0 :(得分:4)

将更复杂的问题分解为更简单,更短的子部分总是一个好主意。在这种情况下,我们可以通过首先编写子问题的解决方案来简化一般解决方案,如下所示:

  1. 首先,构建一个创建字符串列表的过程,其中字符串为"*****""****"或......或"*"
  2. 其次,编写一个给定字符串和数字的repeat帮助程序,多次重复该字符串 - 例如:(repeat "*" 3)将返回"***"
  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
    

    如果仔细观察,两个程序共享完全相同的结构。基本情况(空列表和空字符串)返回的值以及用于将部分答案(consstring-append)粘在一起的过程会发生什么变化。

答案 1 :(得分:1)

如果您只想查找如何将数字转换为字符串,则可以使用(number->string x)

但是,由于您希望将数字表示为星号,因此在构造一串星号之前,最好将它们保留为数字。在这种情况下,您可能需要一个方法,如:

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

答案 2 :(得分: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)))))

这很好地尾递归;通过将“*”添加到结果列表的第一个元素来构建结果列表。