>:期望一个真实的,给定的(无效)
>: expects a real, given (void)
我目前正在努力创建一个列表,以查找列表中的所有数字是否彼此相等:
(define (list-all-equal lon) (cond [(empty? lon) lon]
[(empty? (rest lon)) (first lon)]
[(empty? (rest (rest lon))) (first lon)]
[(equal? (first lon) (list-all-equal(rest lon))) (write #true)]
[(> (first lon) (list-all-equal(rest lon))) (write #false)]
[(< (first lon) (list-all-equal(rest lon))) (write #false)]
[else (list-all-equal (rest lon))]))
但是,我不断收到错误消息:>: expects a real, given void
。有没有办法解决这个错误?
问题是你调用 write
作为递归的一部分,并且 write
"returns" void
,这将导致类似这个:
(> some-number (void))
切勿使用 write
到 return 程序中的值!我们想要 return 结果,而不是 在控制台上显示 结果。对于这种情况,您必须以这样的方式实现您的程序,如果它找到不同的数字,它就会停止比较——结果是错误的,我们不应该继续。一个好的策略是传递第一个元素并将其余元素与其进行比较:
(define (list-all-equal lst)
(if (empty? lst)
#t
(list-all-equal-helper (first lst) (rest lst))))
(define (list-all-equal-helper ele lst)
(cond ((empty? lst) #t)
((not (= (first lst) ele)) #f)
(else (list-all-equal-helper ele (rest lst)))))
或者,我们可以使用 apply
:)
(define (list-all-equal lst)
(apply = lst))
无论哪种方式,它都按预期工作:
(list-all-equal '(1 2 3))
=> #f
(list-all-equal '(1 1 1))
=> #t
write
不是 return 值,因此当您与递归结果进行比较时,您最终将与“无”进行比较。
此外,你的函数应该return#true
或#false
,而不是列表元素,并且将列表元素与递归结果进行比较没有多大意义。
我想你在解决问题之前就开始写代码了。
一个有用的开始方式是列出可能性。
- 空列表的所有元素都相等
- 单例列表的所有元素都相等
- 如果列表至少有两个元素,并且第一个元素等于第二个元素,则所有元素都相等当且仅当其尾部的所有元素都相等
- 否则至少有1个不等元素
已翻译:
(define (list-all-equal lon)
(cond [(empty? lon) #true]
[(empty? (rest lon)) #true]
[(equal? (first lon) (second lon)) (list-all-equal (rest lon))]
[else #false]))
我目前正在努力创建一个列表,以查找列表中的所有数字是否彼此相等:
(define (list-all-equal lon) (cond [(empty? lon) lon]
[(empty? (rest lon)) (first lon)]
[(empty? (rest (rest lon))) (first lon)]
[(equal? (first lon) (list-all-equal(rest lon))) (write #true)]
[(> (first lon) (list-all-equal(rest lon))) (write #false)]
[(< (first lon) (list-all-equal(rest lon))) (write #false)]
[else (list-all-equal (rest lon))]))
但是,我不断收到错误消息:>: expects a real, given void
。有没有办法解决这个错误?
问题是你调用 write
作为递归的一部分,并且 write
"returns" void
,这将导致类似这个:
(> some-number (void))
切勿使用 write
到 return 程序中的值!我们想要 return 结果,而不是 在控制台上显示 结果。对于这种情况,您必须以这样的方式实现您的程序,如果它找到不同的数字,它就会停止比较——结果是错误的,我们不应该继续。一个好的策略是传递第一个元素并将其余元素与其进行比较:
(define (list-all-equal lst)
(if (empty? lst)
#t
(list-all-equal-helper (first lst) (rest lst))))
(define (list-all-equal-helper ele lst)
(cond ((empty? lst) #t)
((not (= (first lst) ele)) #f)
(else (list-all-equal-helper ele (rest lst)))))
或者,我们可以使用 apply
:)
(define (list-all-equal lst)
(apply = lst))
无论哪种方式,它都按预期工作:
(list-all-equal '(1 2 3))
=> #f
(list-all-equal '(1 1 1))
=> #t
write
不是 return 值,因此当您与递归结果进行比较时,您最终将与“无”进行比较。
此外,你的函数应该return#true
或#false
,而不是列表元素,并且将列表元素与递归结果进行比较没有多大意义。
我想你在解决问题之前就开始写代码了。
一个有用的开始方式是列出可能性。
- 空列表的所有元素都相等
- 单例列表的所有元素都相等
- 如果列表至少有两个元素,并且第一个元素等于第二个元素,则所有元素都相等当且仅当其尾部的所有元素都相等
- 否则至少有1个不等元素
已翻译:
(define (list-all-equal lon)
(cond [(empty? lon) #true]
[(empty? (rest lon)) #true]
[(equal? (first lon) (second lon)) (list-all-equal (rest lon))]
[else #false]))