【发布时间】:2014-12-18 12:03:49
【问题描述】:
我对 Scheme、函数式编程,尤其是流完全不熟悉。以下流中的前五个整数是什么?
(define (mystery x y z)
(cons x
(lambda ()
(mystery y z (+ x y z)))))
(mystery 1 2 3)
这是如何工作的,我如何在 Racket 中使用它?
【问题讨论】:
我对 Scheme、函数式编程,尤其是流完全不熟悉。以下流中的前五个整数是什么?
(define (mystery x y z)
(cons x
(lambda ()
(mystery y z (+ x y z)))))
(mystery 1 2 3)
这是如何工作的,我如何在 Racket 中使用它?
【问题讨论】:
我们可以通过实现一个消耗给定数量的元素并在列表中返回它们的过程来检查无限流的内容,例如:
(define (print strm n)
(if (zero? n)
'()
(cons (car strm)
(print ((cdr strm)) (sub1 n)))))
如果我们将它应用到您的流中,我们会得到以下结果:
(print (mystery 1 2 3) 5)
=> '(1 2 3 6 11)
虽然在这种情况下,如果我们尝试了解幕后发生的事情会更有用。最后,这只是一系列过程调用,如果我们注意每次调用时传递的参数,就很容易找到答案。查看下表中的第一列,并记住流是由cons 构建所有x 的:
x y z
--------
1 2 3
2 3 6
3 6 11
6 11 20
11 20 37
【讨论】:
这将返回一个由数字和函数组成的列表。该功能 - 在第一次调用之后 - 与您通过调用获得的相同(神秘 2 3 6) 它是如何工作的? cons 只是列出了它的两个参数,在这种情况下是一个值和评估一个 lambda 函数的结果,它本身就是一个函数
【讨论】: