Нет ничего плохого в том, чтобы вызывать саму функцию. Это называется рекурсия . Если не реализовано должным образом, это может привести к некоторым накладным расходам, но иногда это может быть очень элегантным решением.
При этом, возможно, вы не захотите делать это так, как здесь. Что, если он угадал одно и то же число три раза, прежде чем получил тот, который не был равен 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)
}
Обратите внимание, я проверяю, что у вас есть более одного игрока, чтобы избежать возможности бесконечного цикла.
Но скажем, было 100игроки. И скажем, вы называли это 100 раз. Это нормально, если он вернул игрока 1, затем игрока 2, затем игрока 1 снова, затем игрока 2 снова, повторяя снова и снова, никогда не возвращая игроков с 3 по 100. Это маловероятно, но возможно. Это нормально?
Часто мы хотим вернуть всех игроков, но в случайном порядке. В этом случае вы «перетасуете» список, например,
let players = (0..<allPlayers.count).shuffled()
. Это обеспечит наличие массива целочисленных значений, перетасованного в случайном порядке, но никогда не повторяющего заданное число. Это обеспечивает случайность, а также гарантирует, что каждое значение возвращается только один раз.
Это зависит только от вашего желаемого поведения.