在嵌套循环中查找项的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)))
如果你觉得答案足够,记得把它标记为已接受。