我对良好或不良做法有疑问。
我创建了一个函数,该函数将生成一个随机数。如果随机数等于先前的随机数,则应生成一个新数。所以我的问题是。从方法中调用相同的方法是不好的做法吗?
func getRandomNumber(){ //<-- Method name
let randomNumber = Int.random(in: 0..<allPlayers.count)
if lastRoundNumber == randomNumber{
getRandomNumber() //<-- Like this
}
print(randomNumber)
}
Run Code Online (Sandbox Code Playgroud)
还是我应该这样做?如果是,怎么办?
因此,像我在上面的代码中所做的那样,从当前方法中调用相同的方法是不好的做法吗?提前致谢。
如果是,为什么不好?以及如何获得更好的代码?
调用函数本身并没有错。这称为递归。如果实施不当,可能会带来一些开销,但是有时它可能是一个非常优雅的解决方案。
话虽如此,您可能不想像在这里那样做。如果它在得到一个不等于3的数字之前猜了三次相同的数字lastRoundNumber怎么办?您会看到四个print语句的一个新值。你真的想要那种行为吗?如果要实现getRandomNumber为递归函数,至少我建议return在递归调用自身之后插入一条语句,这样您就不会获得print以与相同的值结束的迭代语句lastRoundNumber。
话虽这么说,当实现比非递归演绎明显更优雅或更直观时,我们通常只会递归(及其带来的开销)。但是在这种情况下,非递归表示法可能同样清楚,因此,我们可能会优先于非递归表示法。它可能看起来像:
func getRandomNumber() {
guard allPlayers.count > 1 else { return }
var randomNumber: Int
repeat {
randomNumber = .random(in: 0..<allPlayers.count)
} while randomNumber == lastRoundNumber
print(randomNumber)
}
Run Code Online (Sandbox Code Playgroud)
请注意,我正在检查您是否有一个以上的玩家,以避免无限循环的可能性。
但是,假设有100位玩家。假设您打过100次电话。如果返回了玩家1,玩家2,玩家1,玩家2,一次又一次地重复一次,就可以了,这样就不会返回任何玩家3到100。这是不可能的,但有可能。这可以吗?
通常,我们想返回所有玩家,但顺序随机。在这种情况下,您可以“拖曳”列表,例如
let players = (0..<allPlayers.count).shuffled()
Run Code Online (Sandbox Code Playgroud)
这样可以确保您拥有一个整数值数组,将其随机排列,但绝不重复任何给定的数字。这提供了随机性,同时还确保每个值仅返回一次。
这仅取决于您期望的行为。
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |