Lambda 球拍:流负和第i元素问题
我有两个关于球拍编程的家庭作业问题: 第一个:编写一个函数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可以同时工作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是下一个数字
(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))