scheme - 为什么我不能在这个函数中返回false,但我可以返回true?(球拍)
问题描述
目标是检查非负数的数字是否按递增顺序排列。
这是我的代码:
(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
),但我的函数不会返回它。如果我决定使用(in-order-iter 123)
,它会返回#t
。当我测试
(< (modulo (quotient 321 10) 10)(modulo 321 10)))
单独,它确实返回#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 返回一些有用的值,会将您锁定在特定的方言中并且不可移植。
如果该值在基本情况下为真,则默认情况为#t
. 然后由于该术语没有结果部分,#t
因此返回值。
推荐阅读
- sockets - 多个客户端 - 服务器聊天应用程序,不允许同一端口上的多个侦听器
- javascript - Vue.js 中基于复选框输入的条件渲染
- mongodb - mongo atlas 是否支持内存存储?
- azure-service-fabric - 从服务结构环境 xml 文件访问环境变量值
- visual-studio - 为什么我从 Visual Studio 2017 收到错误提示?
- ios - 无法从 UIImageView 更改图像
- ruby-on-rails - 如何使用一个复选框更新表中的多个列?
- java - 在 CompletableFuture 回调中为类成员属性设置值是否是线程安全的?
- ruby-on-rails - Rails 中管理员的注册表单
- r-package - 如何在 r 包中添加确认