string-append里面的递归函数

时间:2017-03-09 01:59:05

标签: scheme lisp racket

给定结构layer

(define-struct layer [color doll])

我正在尝试编写一个能够生成所有玩偶颜色的函数。

; colors: Russian doll (RD) -> String
; consumes an RD and produces a string of all colors
(define (colors an-rd)
   (cond
       [(string? an-rd) (string-append an-rd ",")]
       [else
          (colors (layer-doll an-rd))]))

(colors
  (make-layer
   "yellow"
    (make-layer
      "green" "red")))

我希望colors函数在给定上述输入的情况下生成yellow, green, red;但是,它只返回red。我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

基本情况正确(它应该只返回一个字符串),因此对string-append的调用是在错误的地方;我们的想法是在每次递归调用时附加一段字符串,直到没有更多的部分。试试这个:

(define (colors an-rd)
  (cond
    [(string? an-rd) an-rd]
    [else
     (string-append (layer-color an-rd)
                    ", "
                    (colors (layer-doll an-rd)))]))

例如:

(colors
 (make-layer
  "yellow"
  (make-layer
   "green" "red")))

=> "yellow, green, red"