我在上CS61A的课,学习scheme, 我跟着视频敲的代码,完全一样(视频里有代码,视频链接https://www.youtube.com/watch?v=0GcZKmdzPWU&list=PL6BsET-8jgYXHupEH2vUfhlvwbJddZdJM&index=5%EF%BC%89%E4%BD%86%E6%98%AF%E6%88%91%E5%9C%A8terminal 运行时总是报错,该怎么改呢
(define (evenSub s)
(if (null? s) nil
(append (evenSub (cdr s))
(map (lambda (t) (cons (car s) t))
(if (even? (car s))
(evenSub (cdr s))
(oddSub (cdr s))
)
)
(if (even? (car s)) (list (list (car s))) nil))))
(define (oddSub s)
(if (null? s) nil
(append (oddSub (cdr s))
(map (lambda (t) (cons (car s) t))
(if (odd? (car s))
(evenSub (cdr s))
(oddSub (cdr s))))
(if (odd? (car s)) (list(list((car s))) nil)))))
报错信息:
XL@mbp lab11 % python3 scheme -i evensub.scm
Welcome to the CS 61A Scheme Interpreter (version 1.2.5)
scm> (evenSub '(3 4))
Traceback (most recent call last):
0 (append (evensub (cdr s)) (map (lambda (t) (cons (car s) t)) (if (even? (car s)) (evensub (cdr s)) (oddsub (cdr s)))) (if (even? (car s)) (list (list (car s))) ()))
1 (map (lambda (t) (cons (car s) t)) (if (even? (car s)) (evensub (cdr s)) (oddsub (cdr s))))
Error: argument 1 of map has wrong type (NoneType)
scm>
在你提供的代码中,有一个语法错误和一个逻辑错误。
语法错误:
在 (if (odd? (car s)) (list(list((car s))) nil)))))
这一行,多了一个多余的括号。应该修改为 (if (odd? (car s)) (list (list (car s))) nil)))
。
逻辑错误:
在 (if (odd? (car s)) (list (list (car s))) nil)))
这一行,多了一个额外的括号,导致列表的嵌套错误。应该修改为 (if (odd? (car s)) (list (list (car s))) nil))
。
以下是修改后的代码:
(define (evenSub s)
(if (null? s) '()
(append (evenSub (cdr s))
(map (lambda (t) (cons (car s) t))
(if (even? (car s))
(evenSub (cdr s))
(oddSub (cdr s))))
(if (even? (car s)) (list (list (car s))) '()))))
(define (oddSub s)
(if (null? s) '()
(append (oddSub (cdr s))
(map (lambda (t) (cons (car s) t))
(if (odd? (car s))
(evenSub (cdr s))
(oddSub (cdr s))))
(if (odd? (car s)) (list (list (car s))) '()))))
请注意,这里只纠正了语法错误和逻辑错误,但无法确定整个程序的正确性和预期功能是否符合你的需求。
以下答案由GPT-4.0Plus大模型与博主A努力中.......共同编写:
根据你提供的代码和错误信息,问题出现在evenSub函数中。map函数的第一个参数应该是一个函数,但你传入了一个if表达式,导致错误。
正确的evenSub函数定义应该是:
scheme
(define (evenSub s)
(if (null? s) nil
(append
(evenSub (cdr s))
(map (lambda (t) (cons (car s) t))
(if (even? (car s))
(evenSub (cdr s))
(oddSub (cdr s))))
(if (even? (car s)) (list (list (car s))) nil))))
修改后的代码将if表达式作为map函数的第二个参数传入,而第一个参数传入了lambda表达式。
所以,错误出现在你原先的代码中把if表达式作为第一个参数传入map函数,导致报错“argument 1 of map has wrong type”。
将代码修改为上述的正确定义后,重新运行 Scheme 解释器,evenSub函数应该能正常工作。
除此之外,oddSub函数也存在相同的问题,需要作类似修改:
scheme
(define (oddSub s)
(if (null? s) nil
(append
(oddSub (cdr s))
(map (lambda (t) (cons (car s) t))
(if (odd? (car s))
(evenSub (cdr s))
(oddSub (cdr s))))
(if (odd? (car s)) (list(list(car s))) nil))))