复制功能

时间:2015-03-28 21:55:56

标签: scheme racket

我试图重写函数复制的代码,该代码重复列表的第一项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,但我不太确定。

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

谢谢

1 个答案:

答案 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)))