swift - 使用 && 或 || 转义 while 循环 组合条件语句
问题描述
我一直在使用 Swift Playgrounds 应用程序开始学习如何编程,所以不用说我是初学者(对我来说放轻松!)。
我正处于学习编码 1 的最后阶段 - 向右滚动,向左滚动。我在网上找到的解决方案都不像我的,但我的工作。
我感到困惑的是它为什么起作用 - 特别是它如何逃脱 while 循环。
我找到的解决方案:
func navigateWall() {
if isBlockedLeft && !isBlocked {
moveForward()
} else if isBlockedLeft && isBlocked {
turnRight()
} else if isBlockedRight && !isBlocked {
moveForward()
} else if isBlocked {
turnLeft()
}
}
while !isBlocked || !isBlockedLeft || !isBlockedRight {
navigateWall()
if isOnClosedSwitch {
toggleSwitch()
} else if isOnGem {
collectGem()
}
}
让我困惑的部分是逃避while
循环。我在底部的内容似乎在伪代码中读作“当字节没有向前阻塞或没有向左阻塞或没有向右阻塞时,解决这个难题。”
但我真正想说的是,当 Byte 走到迷宫的尽头,他被挡在右边 AND (&&) 左边 AND (&&) 前面时,然后停下来。
但是如果我使用
while !isBlocked && !isBlockedLeft && !isBlockedRight {
...字节一开始根本不动——表面上是因为他被挡在了左边。
这是一个解决难题的视频,但使用更多hacky代码而不是真正的算法(即,如果迷宫在每次运行时都重置为新配置,它将无法工作,就像某些级别所做的那样)。
解决方案
该行:
while !isBlocked || !isBlockedLeft || !isBlockedRight {
应该读作:
如果任一值为假,请继续。不要停止,直到一切都是真的
使用德摩根定律的魔力,可以写成:
while !(isBlocked && isBlockedLeft && isBlockedRight) {
可以读作:
继续前进,直到一切都是真的
这些都是相同的条件,但一个比另一个更清楚。因此,您的原始代码有效,但不太明显。
您不正确的代码:
while !isBlocked && !isBlockedLeft && !isBlockedRight {
方法:
只要没有被阻止,就继续前进。
当然,这意味着一旦其中一个变为真,条件就等于真。不是你想要的。
推荐阅读
- java - 随着数组值的变化,将数组的值存储在单独的文件中
- c# - 如何在 LINQ 和 Lambda 中使用 LEFT JOIN 获得平均值
- elasticsearch - 使用 Kafka Connect 更新现有文档上的 Elasticsearch 字段,而不是创建新的
- c++ - 在 C++ 中使用类绘制圆
- sql - 如何根据where条件对行求和
- python - facebook 在 selenium 无头运行时检测浏览器自动化
- django - 异常 __str__ 在 Django 中返回非字符串(字节类型)
- spring-boot - InvalidFormatException for Date - 在不使用 JsonFormat 或修改原始类的情况下进行修复
- r - R - 将每个数据帧保存在数据帧列表中
- java - 从 res 文件夹中读取 csv 文件