当第二个元素是sn-1次的串联,其间有空格时,scheme字符串减少

当第二个元素是sn-1次的串联,其间有空格时,scheme字符串减少,scheme,racket,Scheme,Racket,下面的问题 设计一个名为stringreduce的程序,该程序使用一个字符串s和一个数字n,并生成一个字符串列表。结果列表包含n个元素,第一个元素是sn次与中间空格的连接,第二个元素是sn-1次与中间空格的连接,等等 (string-reduce "Test" 4) => (cons "Test Test Test Test" (cons "Test Test Test" (cons "Test

下面的问题

设计一个名为stringreduce的程序,该程序使用一个字符串s和一个数字n,并生成一个字符串列表。结果列表包含n个元素,第一个元素是sn次与中间空格的连接,第二个元素是sn-1次与中间空格的连接,等等

(string-reduce "Test" 4) => 
         (cons "Test Test Test Test"
               (cons "Test Test Test" 
                     (cons "Test Test" 
                           (cons "Test" empty))))
所以我必须做一个n-1次的递归

(define (string-reduce s n)
(cond
   [(zero? n) empty]
   [else (cons (string-dup s n)
               (string-reduce (string-dup s (sub1 n)) (sub1 n)))]))


(string-reduce "Test" 4) 

(string-dup s n) gives you "s s s.....s" (n times) 

(string-dup s (sub1 n)) gives you "s s s....." (n-1 times) 
所以它应该返回示例结果,而不是

(list
 "Test Test Test Test"
 "Test Test Test Test Test Test Test Test Test"
 "Test Test Test Test Test Test Test Test Test Test Test Test"
 "Test Test Test Test Test Test")

有没有可能出什么问题?我怀疑递归过程。

在递归调用中,您

  • 对当前值n执行一些操作(此处:调用
    字符串dup
  • 然后递归调用
    字符串reduce
    ,递减n
  • 无需再次调用
    string dup
    作为
    string reduce
    的参数;递归调用将处理以下问题:

    (define (string-reduce s n)
      (cond
        [(zero? n) empty]
        [else      (cons (string-dup s n)
                         (string-reduce s (sub1 n)))]))
    
    测试:

    > (string-reduce "Test" 4) 
    '("Test Test Test Test" "Test Test Test" "Test Test" "Test")