Lambda 球拍:流负和第i元素问题

Lambda 球拍:流负和第i元素问题,lambda,stream,racket,Lambda,Stream,Racket,我有两个关于球拍编程的家庭作业问题: 第一个:编写一个函数kth item,它接受两个参数,第一个是流s,第二个是数字k,它生成从流中提取k个元素的结果,只返回最后一个元素。与前一个非常类似,但只返回单个元素。您可以假设k大于0 第二个:写一个流否定-2和-5,它类似于自然数流(即,1,2,3,…),除了可被2或5整除的数被否定(即,1,-2,3,-4,-5,-6,7,-8,9,-10,11,-12,13,-14,…)。记住,流是一个thunk,当被调用时会产生一对,其中该对的car是下一个数字

我有两个关于球拍编程的家庭作业问题:

第一个:编写一个函数kth item,它接受两个参数,第一个是流s,第二个是数字k,它生成从流中提取k个元素的结果,只返回最后一个元素。与前一个非常类似,但只返回单个元素。您可以假设k大于0

第二个:写一个流否定-2和-5,它类似于自然数流(即,1,2,3,…),除了可被2或5整除的数被否定(即,1,-2,3,-4,-5,-6,7,-8,9,-10,11,-12,13,-14,…)。记住,流是一个thunk,当被调用时会产生一对,其中该对的car是下一个数字,cdr将是流的延续

对于第一个问题,我知道如何获取ith的列表,但我不知道如何继续获取最后一个元素

对于第二个问题,我知道如何得到2或5的作品,但我不知道如何组合它们,所以2和5可以同时工作

(define (next-k-items s k)
  (if (<= k 0)
      empty
      (cons (car (s))
            (next-k-items (cdr (s)) (- k 1)))))


(define (negate-2-and-5)
  (define (f x) (cons (if (= 0 (remainder x 5)) (- x) x)
                      (lambda () (f (+ x 1)))))
  (f 1))
(定义(next-k-items s k)
(如果(
流可以被认为是无限的列表,其中cdr被包装在thunk中(lambda没有参数)

为了便于对流进行操作,我们定义了以下接口:

(define stream? pair?)
(define null-stream null)
(define null-stream? null?)
(define stream-first car)
(define (stream-rest s) ((cdr s)))
可以使用自参考创建流:

(define ones (cons-stream 1 ones))
我们可以在流上定义映射:

(define (stream-map f s)
  (if (null-stream? s)
      null-stream
      (cons-stream (f (stream-first s))
                   (stream-map f (stream-rest s)))))

(define (stream-map2 f s1 s2)
  (if (null-stream? s1)
      null-stream
      (cons-stream (f (stream-first s1) (stream-first s2))
                   (stream-map2 f (stream-rest s1)
                                (stream-rest s2)))))
…并使用它生成nats流:

(define nats (cons-stream 1 (stream-map2 + ones nats)))

可以使用上述函数清晰地定义所需的函数:

;; Stream Number -> Number
;; the kth item of s
(define (kth-item s k)
  (if (= k 1)
      (stream-first s)
      (kth-item (stream-rest s) (sub1 k))))


(check-expect (kth-item nats 1) 1)
(check-expect (kth-item nats 2) 2)
(check-expect (kth-item nats 3) 3)
在您的代码中,
(s)
不正确,因为s不是lambda。我们需要约束第一个元素
(car s)
,并强制流的其余部分
((cdr s))
。这由
流优先
流其余部分
处理

;; Stream Number -> Stream
;; builds a list of first k items of s
(define (next-k-items s k)
  (if (= k 0)
      empty
      (cons (stream-first s)
                   (next-k-items (stream-rest s) (- k 1)))))

(check-expect (next-k-items nats 10) '(1 2 3 4 5 6 7 8 9 10))
地图的定义再次证明是有用的:

;; Stream -> Stream
;; negates the multiples of 2 and 5
(define (negate-2-and-5 s)
  (stream-map (λ (x) (if (or (zero? (modulo x 2))
                             (zero? (modulo x 5)))
                         (* -1 x)
                         x))
              s))
…和
next-k-items

(check-expect (next-k-items (negate-2-and-5 nats) 7) '(1 -2 3 -4 -5 -6 7))
流可以被认为是无限的列表,其中cdr被包装在thunk中(lambda没有参数)

为了便于对流进行操作,我们定义了以下接口:

(define stream? pair?)
(define null-stream null)
(define null-stream? null?)
(define stream-first car)
(define (stream-rest s) ((cdr s)))
可以使用自参考创建流:

(define ones (cons-stream 1 ones))
我们可以在流上定义映射:

(define (stream-map f s)
  (if (null-stream? s)
      null-stream
      (cons-stream (f (stream-first s))
                   (stream-map f (stream-rest s)))))

(define (stream-map2 f s1 s2)
  (if (null-stream? s1)
      null-stream
      (cons-stream (f (stream-first s1) (stream-first s2))
                   (stream-map2 f (stream-rest s1)
                                (stream-rest s2)))))
…并使用它生成nats流:

(define nats (cons-stream 1 (stream-map2 + ones nats)))

可以使用上述函数清晰地定义所需的函数:

;; Stream Number -> Number
;; the kth item of s
(define (kth-item s k)
  (if (= k 1)
      (stream-first s)
      (kth-item (stream-rest s) (sub1 k))))


(check-expect (kth-item nats 1) 1)
(check-expect (kth-item nats 2) 2)
(check-expect (kth-item nats 3) 3)
在您的代码中,
(s)
不正确,因为s不是lambda。我们需要约束第一个元素
(car s)
,并强制流的其余部分
((cdr s))
。这由
流优先
流其余部分
处理

;; Stream Number -> Stream
;; builds a list of first k items of s
(define (next-k-items s k)
  (if (= k 0)
      empty
      (cons (stream-first s)
                   (next-k-items (stream-rest s) (- k 1)))))

(check-expect (next-k-items nats 10) '(1 2 3 4 5 6 7 8 9 10))
地图的定义再次证明是有用的:

;; Stream -> Stream
;; negates the multiples of 2 and 5
(define (negate-2-and-5 s)
  (stream-map (λ (x) (if (or (zero? (modulo x 2))
                             (zero? (modulo x 5)))
                         (* -1 x)
                         x))
              s))
…和
next-k-items

(check-expect (next-k-items (negate-2-and-5 nats) 7) '(1 -2 3 -4 -5 -6 7))