我正在尝试使用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
答案 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)
我希望将其分解为简单的辅助函数的想法使其更容易。请随时随地询问您是否卡住了。