递归结束的判断条件写==和>=有区别吗

2020-03-23 15:41:17 +08:00
 1oNflow

比如判断递归深度是否到达某个值,应该用

if (depth == K) return;

因为逻辑上肯定会先到达 K,而不会超过 K

dfs(depth+1);

但是写成

if (depth >= K) return;

会不会更加缜密(避免意外情况)?

另外 JVM 处理==和>=/<=的判断效率上会有区别吗?

3142 次点击
所在节点    Java
27 条回复
Jooooooooo
2020-03-23 15:42:38 +08:00
jvm 不会在这种东西上有区别的 (那也太笨了吧
mooyo
2020-03-23 15:43:58 +08:00
主要是为了防御性吧,万一其他地方写崩了,depth 没有到达 K 直接到了 K+1 或者 K+2,就完蛋了。
wysnylc
2020-03-23 15:46:49 +08:00
就算有,你也要写>=
Dvel
2020-03-23 15:53:42 +08:00
可能会遭遇高能粒子的冲击,太空辐射导致的 bit 翻转,三体质子的科技锁定,导致永远不会出现 K 。
Jirajine
2020-03-23 15:55:18 +08:00
优先用==和!=吧,因为可能有些类型没有实现大于或小于运算符。
spicecch
2020-03-23 15:56:36 +08:00
@Dvel 一看就是老三体迷了
fffang
2020-03-23 16:05:35 +08:00
突然想到这个,大家看看有没有共通性。

`
if (oneCondition) {
} else if (anotherCondition) {
}
`

`
if (oneCondition) {
} else {
}
`

两种判断没有除了 oneCondition 和 anotherCondition 以外的情况。
CismonX
2020-03-23 16:06:19 +08:00
拿 x86 为例,一般来说这些条件跳转的底层实现都是无外乎比较 ZF/OF/SF/CF 这几个 flag,比如 JZ 检查 ZF == 0,JGE 检查 SF == OF,实际的性能差异即使有也完全可以忽略不计。其他处理器上也是同理,楼主完全不必计较这种级别的性能问题。
fancy111
2020-03-23 16:10:11 +08:00
逻辑就是逻辑,哪有什么区别。你要考虑的是什么情况下要区分开用。
有什么意外情况? n=n+1 难道会跳过一个 1 吗? 。。。除非内存在瞬间被修改。
m30102
2020-03-23 16:12:44 +08:00
概率小于行星撞地球的事就可以不用考虑了。
ilotuo
2020-03-23 16:17:06 +08:00
这种问题有另类点的解决思路: 换个好一点的 ide. 有性能影响编译器会提醒你的
BestSera
2020-03-23 16:17:15 +08:00
同意二楼说的,两种写法逻辑上都没问题,但个人还是倾向>=
就像千年虫 bug,谁还没个万一呢
ilotuo
2020-03-23 16:24:38 +08:00
我错了...别回复我...
autoxbc
2020-03-23 16:33:43 +08:00
宇宙射线的扰动不要考虑么,不然要 ECC 内存做啥
DOLLOR
2020-03-23 16:43:33 +08:00
当然是“>=”和“<=”了。万一未来逻辑修改了,不是+1 步进了,这样更容易发现问题。
LANB0
2020-03-23 17:00:33 +08:00
@fancy111 缓冲区溢出或者多线程环境下也不是不可能出现内存值被瞬间修改的情况,>=显然更稳妥些。入行时,老师傅曾告诉我,你以为永远不会执行的 else 分支,一定会在某个特定条件下执行,然后送你一顶大锅。此处如 @fffang 所说,同理
CodeEncryption
2020-03-23 17:10:48 +08:00
逻辑没错就没有区别
mightofcode
2020-03-23 17:21:17 +08:00
没区别
我有强迫症,喜欢写>=
arthas2234
2020-03-23 17:29:02 +08:00
>=容错率更高
你对你自己写的代码有自信,但是要防备某些猪队友
相信我,有些时候可以救命
newtype0092
2020-03-23 17:38:33 +08:00
@fffang 确实就是这个场景,一定是包含所有情况的代码比依赖某周确定情况(哪怕是+1 操作这种简单明了的)的代码更健壮。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/655389

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX