为什么我不能 return false,但我可以 return true,在这个函数中? (球拍)
Why can't I return false, but I can return true, in this function? (Racket)
目标是检查非负数的数字是否按升序排列。
这是我的代码:
(define (in-order-iter num)
(define (aux num-left result-so-far)
(cond ((equal? result-so-far #f) #f)
((< num-left 10) result-so-far)
((aux (quotient num-left 10) (< (modulo (quotient num-left 10) 10)(modulo num-left 10))))))
(aux num #t))
(in-order-iter 321)
最糟糕的是,当我决定使用 (display result-so-far)
时,我得到了我想要的答案(即 #f
),但我的函数不会 return 它。如果我决定使用 (in-order-iter 123)
,它会 return #t
。
当我测试
(< (modulo (quotient 321 10) 10)(modulo 321 10)))
单独,它会 return #f
,所以它应该将 result-so-far
更改为 #f
。
为什么我会这样?!
编辑:顺便说一句,我可以递归地执行此函数并且它有效:
(define (in-order-recur num)
(if (> num 10)
(if (< (modulo (quotient num 10) 10) (modulo num 10))
(in-order-recur (quotient num 10))
#f)
#t))
(in-order-recur 100000)
您应该使用 else
子句作为最后一个 cond
术语:
(define (in-order-iter num)
(define (aux num-left result-so-far)
(cond ((equal? result-so-far #f) #f)
((< num-left 10) result-so-far)
(else (aux (quotient num-left 10)
(< (modulo (quotient num-left 10) 10)
(modulo num-left 10))))))
(aux num #t))
所以当你不这样做时,#f
会变成谓词,因为它是假的,所以它会进入下一个术语。由于您没有更多的条款,因此由实施来决定 cond
的结果应该是什么。来自 R6RS 的建议是“未指定的值”。例如。 Racket 将导致 #<void>
默认情况下不会打印。实际上,虽然实现可能会做这样的事情:
(define (in-order-iter num)
(define (aux num-left result-so-far)
(cond ((equal? result-so-far #f) #f)
((< num-left 10) result-so-far)
((aux (quotient num-left 10)
(< (modulo (quotient num-left 10) 10)
(modulo num-left 10))))
(else "BaNaNa")))
(aux num #t))
依赖于作为值返回的内容,例如。 MIT Scheme returns 一些有用的值,会将您锁定在特定的方言中并且不可移植。
如果基本情况下的值为真,则默认情况下将为 #t
。然后,由于该术语没有结果部分,因此 #t
是返回值。
目标是检查非负数的数字是否按升序排列。
这是我的代码:
(define (in-order-iter num)
(define (aux num-left result-so-far)
(cond ((equal? result-so-far #f) #f)
((< num-left 10) result-so-far)
((aux (quotient num-left 10) (< (modulo (quotient num-left 10) 10)(modulo num-left 10))))))
(aux num #t))
(in-order-iter 321)
最糟糕的是,当我决定使用 (display result-so-far)
时,我得到了我想要的答案(即 #f
),但我的函数不会 return 它。如果我决定使用 (in-order-iter 123)
,它会 return #t
。
当我测试
(< (modulo (quotient 321 10) 10)(modulo 321 10)))
单独,它会 return #f
,所以它应该将 result-so-far
更改为 #f
。
为什么我会这样?!
编辑:顺便说一句,我可以递归地执行此函数并且它有效:
(define (in-order-recur num)
(if (> num 10)
(if (< (modulo (quotient num 10) 10) (modulo num 10))
(in-order-recur (quotient num 10))
#f)
#t))
(in-order-recur 100000)
您应该使用 else
子句作为最后一个 cond
术语:
(define (in-order-iter num)
(define (aux num-left result-so-far)
(cond ((equal? result-so-far #f) #f)
((< num-left 10) result-so-far)
(else (aux (quotient num-left 10)
(< (modulo (quotient num-left 10) 10)
(modulo num-left 10))))))
(aux num #t))
所以当你不这样做时,#f
会变成谓词,因为它是假的,所以它会进入下一个术语。由于您没有更多的条款,因此由实施来决定 cond
的结果应该是什么。来自 R6RS 的建议是“未指定的值”。例如。 Racket 将导致 #<void>
默认情况下不会打印。实际上,虽然实现可能会做这样的事情:
(define (in-order-iter num)
(define (aux num-left result-so-far)
(cond ((equal? result-so-far #f) #f)
((< num-left 10) result-so-far)
((aux (quotient num-left 10)
(< (modulo (quotient num-left 10) 10)
(modulo num-left 10))))
(else "BaNaNa")))
(aux num #t))
依赖于作为值返回的内容,例如。 MIT Scheme returns 一些有用的值,会将您锁定在特定的方言中并且不可移植。
如果基本情况下的值为真,则默认情况下将为 #t
。然后,由于该术语没有结果部分,因此 #t
是返回值。