MrJ*_*006 0 data-binding recursion scheme racket
我在这里开始了一个关于我正在开发的刽子手游戏的问题。
我觉得刽子手部分让人们对我的真实问题和问题感到困惑。我的问题是,我从递归循环中调用了各种定义的函数并得到了不正确的值。当我自己调用这些相同的函数时(不是在递归循环中),它们会按预期工作。我知道这要么是我忽略的东西,要么是我需要解决方法的变量绑定问题。
首先在这里重现问题代码:
(define (recurse a_list a_number)
(cond ((= a_number 0)
(display "Zero Condition.")
)
(else
(display "\n\n")
(display-list a_list ",")
(display "\n")
(display (car a_constant))
(display "\n")
(display "If the above letter is in the list, result should be true\n")
(display (contains? a_list (car a_constant)))
(display "\n")
(display "Enter a letter:")
(recurse (cons (symbol->string (read)) a_list) (- a_number 1))
)
)
)
Run Code Online (Sandbox Code Playgroud)
以下是我在递归循环中使用的定义:
(define (display-list a_list separater)
(if (null? a_list)
(display "")
(begin
(display (car a_list))
(if (null? (cdr a_list))
(display "")
(display separater))
(display-list (cdr a_list) separater)
)
)
)
(define (contains? list item)
;(display "\n")
;(display list)
;(display "\n")
;(display item)
;(display "\n")
(cond ((empty? list)
#f
)
((eq? (first list) item)
#t
)
(else
(contains? (rest list) item)
)
)
)
(define a_constant '("n" "o" "t" "w" "o" "r" "k" "i" "n" "g"))
(define test_li_1 '("n" "b"))
(define test_li_2 '("a" "b"))
Run Code Online (Sandbox Code Playgroud)
这是我跑的:
> (contains? a_constant (car test_li_1))
#t
> (contains? a_constant (car test_li_2))
#f
Run Code Online (Sandbox Code Playgroud)
它按预期工作。
当我运行递归循环时,这就是我得到的:
> (recurse test_li_2 2)
a,b
n
If the above letter is in the list, result should be true
#f
Enter a letter:n
n,a,b
n
If the above letter is in the list, result should be true
#f
Run Code Online (Sandbox Code Playgroud)
在我看来,第一个输出是正确的,但第二个不是。
当我使用 test_li_1 运行时,它总是评估为真,它应该是因为“n”总是在我的 a_list 中。我通过几次测试组合在一起的是,递归函数继续使用我最初传入的列表,并且不使用附加版本进行函数调用,这不是我想要它做的。我也觉得应该不是这样吧?不应该使用我传入的值而不是来自多个递归级别的值吗?我正在用 #lang 球拍在 Dr. Racket 中测试这一切,以防万一。
发生报告的问题是因为您正在使用eq?来测试字符串是否相等。从文档:
(eq? v1 v2) ? boolean?:#t如果v1和v2引用同一个对象,#f则返回,否则返回。
所以你看,eq?是测试身份,而不是平等。为此,您应该使用string=?或equal?。修改contains?程序如下,它会工作:
(define (contains? list item)
(cond
((empty? list) #f)
((string=? (first list) item) #t)
(else (contains? (rest list) item))))
Run Code Online (Sandbox Code Playgroud)