方案递归循环不正确的值和变量绑定

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 中测试这一切,以防万一。

Ósc*_*pez 5

发生报告的问题是因为您正在使用eq?来测试字符串是否相等。从文档:

(eq? v1 v2) ? boolean?:#t如果v1v2引用同一个对象,#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)