Kotlin中能否结合repeat()与while()实现3次上限的条件循环?
问题根源拆解
你当前写出的嵌套代码失效的核心原因,是循环嵌套逻辑完全反向、没有给内层while()设置合理的出口:
- 外层
repeat(3)的设计本意是为程序兜底最多执行3次生日输入 - 内层
while()的判断条件是“只要没抽到目标运势就一直循环”,且循环体中没有任何跳出while的逻辑 - 执行流刚进入第一次
repeat的代码块,就会被卡在内层while里反复执行输入、抽运势操作,直到抽到目标文本才会跳出内层循环。这时repeat的3次计数已经完全失效——因为第一次repeat的代码块都还没执行完,根本轮不到后面2次计数触发。
可行性结论
完全可以结合repeat()和while()实现“满足任意一个退出条件即终止”的需求,不存在功能层面的阻碍。只要理顺两个循环的职责分工:
- 外层
repeat(3)承担“最多执行3次”的兜底职责 - 内层
while()承担“判断是否还没到提前退出阈值”的条件判断职责 - 必须给内层
while()设置单次执行的出口,不能让它形成无终止条件的死循环,保证每轮核心逻辑执行完后,把执行权交回外层repeat的计数流程
可正常运行的结合实现参考
fun main(args: Array<String>) { var fortune: String = "" repeat(3) { // 每轮循环开头判断是否还未抽到目标运势 while (!fortune.contains("Take it easy")) { fortune = getFortune(getBirthday()) println("\nYour fortune is: $fortune") // 执行完一次核心操作就跳出while,回到repeat的计数流程 break } // 抽到目标运势时直接终止整个repeat流程 if (fortune.contains("Take it easy")) return@repeat } } fun getBirthday(): Int { print("\nEnter your birthday: ") return readLine()?.toIntOrNull() ?: 1 } fun getFortune(birthday: Int): String { val fortunes = listOf("You will have a great day!", "Things will go well for you today.", "Enjoy a wonderful day of success.", "Be humble and all will turn out well.", "Today is a good day for exercising restraint.", "Take it easy and enjoy life!", "Treasure your friends, because they are your greatest fortune.") val index = when (birthday) { in 1..7 -> 4 28, 31 -> 2 else -> birthday.rem(fortunes.size) } return fortunes[index] }
执行逻辑校验
上述代码的运行效果完全匹配需求:
- 每进入一轮
repeat,先通过while判断是否还需要执行核心逻辑 - 执行完一次生日输入、运势打印后立刻跳出
while,不会出现卡在内层循环的问题 - 只要抽到带“Take it easy”的运势,就直接终止整个
repeat流程,不再执行后续轮次 - 即使一直没抽到目标运势,
repeat(3)也会在3轮执行完成后自动终止,不会出现无限制循环的问题
内容的提问来源于stack exchange,提问作者Lisa Baron
相关产品推荐
相关产品推荐

