我想返回等于2的值。如果等于2则为“true
”,如果不等于2则为“false
”,如果不是数字则为“not
” }”。以下是我的代码段。
(define (test mList)
(if (null? mList)
'()
(let ((x (car mList))
(y (cdr mList)))
(if (number? x)
(cond ((= x 2) (cons "true" (test y)))
((list? x) (append (test x)
(test y)))
(else (cons "false" (test y))))
(cons "not" (test y))))))
(display (test '(b a (2 b) 9 2 2 g)))
返回(not not not false true true not)
。括号(2 b)
中的值计算为1,然后返回not
。
输出如何如此。
(not not true not false true true not)
。
我错过了什么?
答案 0 :(得分:1)
以下是您的代码,其中包含一些注释,可能会说明为什么您不会递归列表中的列表:
(define (test lst)
(if (null? lst)
'() ; lst is null
(let ((a (car lst)) ; lst is not null
(d (cdr lst)))
(if (number? a)
(cond ((= a 2) (cons "true" (test d))) ; if a is a number and equal to 2
((list? a) (append (test a) ; if a is a number and not equal to 2 and a list at the same time
(test d)))
(else (cons "false" (test d)))) ; if a is a number and not equal to 2 and not a list
(cons "not" (test d)))))) ; a is not a number
我在这里重命名了一些变量,但它也是如此。
检查元素是否为列表的代码是先前测试的结果,它是一个数字。由于某个号码不能是列表,因此您的列表最终会作为您在列表中添加“not”的替代方式。
列表(2 b)
不是数字,因此完全符合您的规范:
如果等于2则为“true”,如果不等于2则为“false”,如果不等于a 数字然后“不”
如果谓词和后果被移动到(number? a)
的替代,则处理子列表的代码是正确的。例如。
(cond
((list? a) <do list stuff>) ; a is perhaps a list
((not (number? a)) <not number stuff>) ; a is not a list, perhaps number?
((= a 2) <do 2 stuff>) ; a not list and is number, perhaps 2?
(else <do number not 2 stuff>)) ; a is not list and is number and not 2
注意我已经重新排序了一段时间,因为以前的测试是错误的并且可以进行更平坦的案例分析。