Stream 流的这种实现是如何工作的?

Stream 流的这种实现是如何工作的?,stream,scheme,racket,Stream,Scheme,Racket,我对Scheme、函数式编程,特别是streams是一个全新的概念。以下流中的前五个整数是什么 (define (mystery x y z) (cons x (lambda () (mystery y z (+ x y z))))) (mystery 1 2 3) 这是如何工作的,我如何在Racket中使用它?这将返回一个由数字和函数组成的列表。在第一次调用后,函数与调用时得到的函数相同(神秘2 3 6) 它是如何工作的?cons只是列出它的两个参数

我对Scheme、函数式编程,特别是streams是一个全新的概念。以下流中的前五个整数是什么

(define (mystery x y z)
  (cons x
        (lambda ()
          (mystery y z (+ x y z)))))

(mystery 1 2 3)

这是如何工作的,我如何在Racket中使用它?

这将返回一个由数字和函数组成的列表。在第一次调用后,函数与调用时得到的函数相同(神秘2 3 6)
它是如何工作的?cons只是列出它的两个参数,在本例中是一个值和计算lambda函数的结果,lambda函数本身就是一个函数,它返回一个由数字和函数组成的列表。在第一次调用后,函数与调用时得到的函数相同(神秘2 3 6)
它是如何工作的?cons只是列出它的两个参数,在本例中是一个值和计算lambda函数的结果,lambda函数本身就是一个函数,它返回一个由数字和函数组成的列表。在第一次调用后,函数与调用时得到的函数相同(神秘2 3 6)
它是如何工作的?cons只是列出它的两个参数,在本例中是一个值和计算lambda函数的结果,lambda函数本身就是一个函数,它返回一个由数字和函数组成的列表。在第一次调用后,函数与调用时得到的函数相同(神秘2 3 6)
它是如何工作的?cons只是列出了它的两个参数,在本例中是一个值和计算lambda函数的结果,lambda函数本身就是一个函数,我们可以通过实现一个过程来检查无限流的内容,该过程消耗给定数量的元素并在列表中返回它们,例如:

(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
ing所有
x
构建的:

 x  y  z
--------
 1  2  3
 2  3  6
 3  6 11
 6 11 20
11 20 37

我们可以通过实现一个过程来检查无限流的内容,该过程使用给定数量的元素并在列表中返回它们,例如:

(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
ing所有
x
构建的:

 x  y  z
--------
 1  2  3
 2  3  6
 3  6 11
 6 11 20
11 20 37

我们可以通过实现一个过程来检查无限流的内容,该过程使用给定数量的元素并在列表中返回它们,例如:

(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
ing所有
x
构建的:

 x  y  z
--------
 1  2  3
 2  3  6
 3  6 11
 6 11 20
11 20 37

我们可以通过实现一个过程来检查无限流的内容,该过程使用给定数量的元素并在列表中返回它们,例如:

(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
ing所有
x
构建的:

 x  y  z
--------
 1  2  3
 2  3  6
 3  6 11
 6 11 20
11 20 37

伟大的完美答案!我想我现在对溪流的概念有了清晰的理解。太棒了!完美答案!我想我现在对溪流的概念有了清晰的理解。太棒了!完美答案!我想我现在对溪流的概念有了清晰的理解。太棒了!完美答案!我想我现在已经清楚地理解了流的概念。非常感谢你的回答。非常感谢你的回答。非常感谢你的回答。非常感谢你的回答。非常感谢你的回答。