在Scheme语言中重复字符串列表

时间:2017-12-26 17:14:42

标签: scheme

我正在尝试使用Scheme语言编写代码。我想输入一个列表并返回列表的字符串表示形式,其中第一个元素重复一次,第二个元素重复两次,第三个元素重复三次喜欢

input is => (c d g) 输出=> (c d d g g g)

我编写了一个复制所有元素的代码。我应该使用循环来重复所有元素从第一个到最后一个1到n次。(n是列表的大小)。但我不知道如何。

(define repeat
  (lambda (d)
    (cond [(null? d) '()]
          [(not (pair? (car d)))
           (cons (car d)
                 (cons (car d)
                       (repeat (cdr d))))]
          [else (cons (repeat (car d))
                      (repeat (cdr d)))])))

                (repeat '(a b c d e)) => aa bb cc dd ee


(define size
    (lambda (n)
        (if (null? n)               
             0                
            (+ 1 (size (cdr n)))))) 
(size '(A B C D)) => 4

1 个答案:

答案 0 :(得分:1)

您需要为此制作一些不同的功能。

  • repeat(正如您所描述的)就像这样(repeat '(c d g)) ;=> (c d d g g g)

实现它的最佳方法是使用帮助器(repeat-aux n lst)重复第一个元素n次,第二个元素重复n+1次等等。

鉴于您可以定义:

(define (repeat lst) (repeat-aux 1 lst))

要实现repeat-aux,您可以使用像这样的递归模式

(define (repeat-aux n lst)
  (if (null? lst)
      '()
      ... (repeat-aux (+ n 1) (cdr lst) ...))

我只是给出功能的草图或轮廓,而不是整个事物。这样你就可以自己动手了。

要实现repeat-aux,我还建议制作一个帮助函数(replicate n elt tail),其工作方式如下:

(replicate 3 'o '(u v w)) ;=> (o o o u v w)

我希望将其分解为简单的辅助函数的想法使其更容易。请随时随地询问您是否卡住了。