将程序计划为 return 列表中的正数仅 returns t/f
Scheme program to return positive numbers in a list only returns t/f
我制作了这个程序来遍历列表中的数字,并且只 return 正数。这个逻辑似乎是正确的,但它是 returning #t
或 #f
取决于它是否是积极的。
我如何得到这个 return 实际数字?它应该跳过负数。
(define (new-pos-iterator L)
(let ((head L))
(lambda ()
(if (null? head)
#f
(let ((currN (>= (car head) 0)))
(set! head (cdr head))
currN)
)
)
)
)
(define pos (new-pos-iterator '(4 -1 -3 6)))
所以这个例子应该return调用时为 4,再次调用时为 6
它完全按照您写的那样执行。
变化很简单:
(define (new-pos-iterator L)
(let ((head L))
(lambda ()
(if (null? head)
#f
(let ((currN ;; (>= (car head) 0))) ;; was performing test too early
(car head)))
(set! head (cdr head))
;; currN ;; was returning the test result unconditionally
(if ;; perform the test _now_:
(>= currN 0)
;; is non-negative, return it
_______ ;; fill the blanks
;; otherwise negative, skip it
_______ ) ;; fill the blanks
)))))
如何跳过呢?好吧,我们已经做到了,所以问题就变成了,如何 return 剩余列表中的第一个正成员? (好吧,非负数,但谁会关心差一错误,对吧?)。
难道我们(有点) 没有一个功能可以为我们做这件事吗?
如果我们命名它,我们可以再次调用它。再一次,根据需要。
那么,那里叫什么? (new-pos-iterator head)
?
不,不是那样。它将 return 需要调用的生成器过程 -- (lambda () ...)
形式的结果。 那个是需要命名的;在自身内部调用;并将其命名,我们只是 return 是 (new-pos-iterator ...)
.
的结果
当然,命名——绑定——需要递归。
letrec
这样做。
否则,我们可以使用内部使用 letrec
的命名循环对其进行编码。
我制作了这个程序来遍历列表中的数字,并且只 return 正数。这个逻辑似乎是正确的,但它是 returning #t
或 #f
取决于它是否是积极的。
我如何得到这个 return 实际数字?它应该跳过负数。
(define (new-pos-iterator L)
(let ((head L))
(lambda ()
(if (null? head)
#f
(let ((currN (>= (car head) 0)))
(set! head (cdr head))
currN)
)
)
)
)
(define pos (new-pos-iterator '(4 -1 -3 6)))
所以这个例子应该return调用时为 4,再次调用时为 6
它完全按照您写的那样执行。
变化很简单:
(define (new-pos-iterator L)
(let ((head L))
(lambda ()
(if (null? head)
#f
(let ((currN ;; (>= (car head) 0))) ;; was performing test too early
(car head)))
(set! head (cdr head))
;; currN ;; was returning the test result unconditionally
(if ;; perform the test _now_:
(>= currN 0)
;; is non-negative, return it
_______ ;; fill the blanks
;; otherwise negative, skip it
_______ ) ;; fill the blanks
)))))
如何跳过呢?好吧,我们已经做到了,所以问题就变成了,如何 return 剩余列表中的第一个正成员? (好吧,非负数,但谁会关心差一错误,对吧?)。
难道我们(有点) 没有一个功能可以为我们做这件事吗?
如果我们命名它,我们可以再次调用它。再一次,根据需要。
那么,那里叫什么? (new-pos-iterator head)
?
不,不是那样。它将 return 需要调用的生成器过程 -- (lambda () ...)
形式的结果。 那个是需要命名的;在自身内部调用;并将其命名,我们只是 return 是 (new-pos-iterator ...)
.
当然,命名——绑定——需要递归。
letrec
这样做。
否则,我们可以使用内部使用 letrec
的命名循环对其进行编码。