我试图重写函数复制的代码,该代码重复列表的第一项n次,然后返回带有重复的第一项和列表其余部分的列表。这是原始功能:
(check-expect (replicateone 1 '(stays the same)) '(stays the same))
(check-expect (replicateone 0 '(hello bye)) '(bye))
(check-expect (replicateone 3
'(repeat second third ))
'(repeat repeat repeat second third))
(define (replicateone n nonemptylist)
(cond [(zero? n) (rest nonemptylist)]
[else
(cons (first nonemptylist) (replicateone (sub1 n) nonemptylist))]))
这就是我现在所拥有的,但它不起作用。
(define (iterate f n x)
(cond
[(zero? n) x]
[else (iterate f (sub1 n) (f x))]))
(define (replicateone n nonemptylist)
(iterate (λ (x) (list x x)) n nonemptylist))
我试图在没有所有递归的情况下在ISL +中执行此操作,但我不确定如何使用新技术编写迭代函数。我觉得这会使用foldr,但我不太确定。
任何帮助都会很棒,因为我还在学习。
谢谢
答案 0 :(得分:2)
以下是我如何使用iterate
:
(define (replicateone n lst)
(iterate (lambda (x) (cons (first lst) x)) n (rest lst)))
这里"""没有使用直接递归的iterate
的实现,并且可以使用ISL +正确运行,但是,它(有意地)被混淆了。您将尝试弄清楚它是如何工作的。 ; - )
(define (iterate f n x)
(foldl (compose f second list) x (make-list n #f)))