在嵌套循环中查找项的Scheme编程

在嵌套循环中查找项的Scheme编程,scheme,Scheme,我有下列物品 (define itemslist (list 'a1 'b2 'c3 (list 'z1 'z2) 'd5 'e6)) 下面是我查找项目的方法 (define find-item (lambda (item itemslist) (cond ((null? itemslist) #f) ((list? (car itemslist)) (cond ((null? itemslist) #f)

我有下列物品

(define itemslist
  (list 'a1 'b2 'c3 (list 'z1 'z2) 'd5 'e6))
下面是我查找项目的方法

(define find-item
  (lambda (item itemslist)
    (cond ((null? itemslist) #f)
          ((list? (car itemslist))
            (cond ((null? itemslist) #f)
                  (else (find-item item (car itemslist)))))
          ((equal? stn (car itemslist)) (display "found"))
          (else (find-stn stn (cdr itemslist)))
          )
    )
  )
用我上面的方法,我可以找到a1,b2,c3,z1,z2。但当我想找到d5以后的值时,它什么也不返回。它似乎已经跳过了堆栈。顺便说一句,我刚刚开始学习这个计划,所以简单的解释会更好

再来一个问题,如果我有这个呢

(list 'a1 'b2 'c3 (list 'z1 (list 'y1 'y2) 'z2) 'd5 'e6)
这也行吗?谢谢

是的,您可以跳过列表。
例如:

如果
(列表?'(2 3))
为真,则不会计算
其他部分(外部
cond
),因此跳过
4

因此,要么将
else
部分放入
列表?
块中,要么重新设计代码

如果
itemlist
是一个
list/pair
,您可以在递归调用中立即传递它,因此
您可以避免在谓词中编写类似于
(caritemslist)
的代码,从而使代码变得简单

以下是重新设计(简化)的版本:

提示:您也可以使用
(…)
符号而不是
(list…
)来编写列表,即

(find-item 'z2 '('a1 'b2 'c3 '('z1 '('y1 'y2) 'z2) 'd5 'e6))  
#t  
(find-item 'e6 '('a1 'b2 'c3 '('z1 '('y1 'y2) 'z2) 'd5 'e6))  
#t

为了写更多而写更多。。。这通常被称为“树漫游”,因为这样的嵌套列表实际上是一个二叉树。列表实际上是由二进制对组成的,因此当您有一对
(l.r)
时,
l
是树的左分支,
r
是树的右分支

例如,
'(1(23)4)
'(1.((2.(3)))(4.()))
的缩写,可以绘制为

     .
    / \
   1   .
      / \
     /   .
    /   / \
   .   4  ()
  / \ 
 2   .
    / \
   3  ()

在任何一对
(l.r)
car
让你进入左边的树,
cdr
让你进入右边的树。因此,当您编写
(pair?ls)
时,您实际上是在询问您是否在树中的一个分支上,此时您应该在左分支(
car
)和右分支(
cdr
)上重复出现。希望这有助于您理解列表。

即使您得到了您的[具体]答案,这里也有一些东西可以帮助您解决类似的问题

(define describe
  (lambda (e)
    (cond #;((list? e)
             `(list ,@(map describe e)))
          ((pair? e)
           `(cons ,(describe (car e))
                  ,(describe (cdr e))))
          ((vector? e)
           `(vector ,@(map describe (vector->list e))))
          ((or (null? e) (symbol? e)) `',e)
          (else e))))
此过程打印生成给定sexpr的代码。例如:

> (describe '(a 2 b 3))
(cons 'a (cons 2 (cons 'b (cons 3 '()))))
> (describe ''''a)
(list 'quote (list 'quote (list 'quote 'a)))
它还将在需要的地方放置引号,因此它将引号放在符号或()之前,而不是数字之前。当您熟悉嵌套对时,可能需要删除
#位于第三行,以生成更紧凑的输出:

> (describe '(a 2 b 3))
(list 'a 2 'b 3)
这段代码可以教你很多关于报价的东西。例如:

> (describe '(a 2 b 3))
(cons 'a (cons 2 (cons 'b (cons 3 '()))))
> (describe ''''a)
(list 'quote (list 'quote (list 'quote 'a)))

如果你觉得答案足够,记得把它标记为已接受。