复制功能

Replicate Function

我正在尝试重写函数 replicate 的代码,该函数将列表的第一项重复 n 次,然后 returns 列表包含重复的第一项和列表的其余部分。这是原始函数:

(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,但我不太确定。

任何帮助都会很棒,因为我还在学习。

谢谢

这是我使用 iterate 的方法:

(define (replicateone n lst)
  (iterate (lambda (x) (cons (first lst) x)) n (rest lst)))

这里是 iterate 的 "an" 实现,它不使用直接递归并且 运行 使用 ISL+ 正确执行,但是,它(有意)被混淆了。尝试弄清楚它是如何工作的,你会很开心。 ;-)

(define (iterate f n x)
  (foldl (compose f second list) x (make-list n #f)))