SICP Lisp/Scheme - 递归 return 值丢失
SICP Lisp/Scheme - recursive return value gets lost
我正在编写一个简单的函数,它递归地检查 x
(列表)是否是 remaining
(列表的列表)的元素。
不知何故,来自最内层框架的 #f
return 没有正确地冒泡到顶部:
#lang sicp
(define (was_seen? remaining x)
(cond ((null? remaining) #false)
((eq? (car remaining) x) #true)
((was_seen? (cdr remaining) x))
)
)
; test variables
(define seen (list(list 'a)))
(define z (list 0))
; now the test
(was_seen? seen z)
; expected: #f; returns blank (evaluated to #void when seen via debugger)
(was_seen? (cdr seen) z)
; expected: #f; returns #f as it should.
; This is what the inner (recursive) call - correctly - evaluates to.
; It's just that this #f doesn't get properly returned to the global caller?
这一定是一些愚蠢简单的东西,但我找不到什么。任何帮助将不胜感激。
cond
returns 条件为真(即非 #f
)的第一个子句正文中的值,或 else
子句的值如果 none 个是真实的。
如果 none 个条件为真,并且没有 else
子句,则 returns #void
.
在您的情况下,none 个条件永远为真,因为递归调用为假。
将最后一个子句更改为 else
子句,这样递归调用的值将被 returned。
(define (was_seen? remaining x)
(cond ((null? remaining) #false)
((eq? (car remaining) x) #true)
(else (was_seen? (cdr remaining) x))
)
)
您可能认为您依赖于快捷方式,即如果子句中没有正文,则条件的值是 returned。但这只有在条件为真时才会发生,因此这是要 return 值的子句。当条件为假时,它不适用。
我正在编写一个简单的函数,它递归地检查 x
(列表)是否是 remaining
(列表的列表)的元素。
不知何故,来自最内层框架的 #f
return 没有正确地冒泡到顶部:
#lang sicp
(define (was_seen? remaining x)
(cond ((null? remaining) #false)
((eq? (car remaining) x) #true)
((was_seen? (cdr remaining) x))
)
)
; test variables
(define seen (list(list 'a)))
(define z (list 0))
; now the test
(was_seen? seen z)
; expected: #f; returns blank (evaluated to #void when seen via debugger)
(was_seen? (cdr seen) z)
; expected: #f; returns #f as it should.
; This is what the inner (recursive) call - correctly - evaluates to.
; It's just that this #f doesn't get properly returned to the global caller?
这一定是一些愚蠢简单的东西,但我找不到什么。任何帮助将不胜感激。
cond
returns 条件为真(即非 #f
)的第一个子句正文中的值,或 else
子句的值如果 none 个是真实的。
如果 none 个条件为真,并且没有 else
子句,则 returns #void
.
在您的情况下,none 个条件永远为真,因为递归调用为假。
将最后一个子句更改为 else
子句,这样递归调用的值将被 returned。
(define (was_seen? remaining x)
(cond ((null? remaining) #false)
((eq? (car remaining) x) #true)
(else (was_seen? (cdr remaining) x))
)
)
您可能认为您依赖于快捷方式,即如果子句中没有正文,则条件的值是 returned。但这只有在条件为真时才会发生,因此这是要 return 值的子句。当条件为假时,它不适用。