R语言for循环如何打印列表下一个元素?修复《十只绿瓶子》输出问题
解决《十只绿瓶子》歌词输出的数字迭代问题
我看了你的代码,问题出在每段最后一行硬编码了number[2](也就是"Nine"),没有根据当前数字动态获取下一个数字。咱们来一步步修正这个问题:
核心修改思路
- 补全数字序列,包含从"Ten"到"One"的所有单词,方便遍历每一段;
- 遍历每个数字时,动态匹配它的下一个数字(比如Ten的下一个是Nine,Two的下一个是One);
- 单独处理最后一段(One之后变成No)的单复数和文本逻辑,让歌词更准确。
修正后的完整代码
library(stringr) # 确保加载stringr包,因为用到了str_c # 补全数字序列,覆盖从Ten到One的所有表述 number <- c("Ten", "Nine", "Eight", "Seven", "Six", "Five", "Four", "Three", "Two", "One") and_if <- "And if one green bottle should accidentally fall," bottles <- function() { for (i in seq_along(number)) { current_num <- number[i] # 动态获取下一个数字:最后一个(One)的下一个是"No",其余取序列中的下一个元素 next_num <- if (i == length(number)) "No" else number[i + 1] # 处理瓶子的单复数:仅One和No对应单数(No时逻辑上无数量,也用单数形式) current_bottle <- if (current_num == "One") "bottle" else "bottles" next_bottle <- if (next_num %in% c("No", "One")) "bottle" else "bottles" # 打印当前段重复的两行歌词 cat(str_c(rep(paste(current_num, "green", current_bottle, "hanging on the wall"), 2), collapse = "\n"), "\n") # 打印固定过渡句 cat(and_if, "\n") # 打印动态生成的下一段开头句 cat(paste("There'll be", next_num, "green", next_bottle, "hanging on the wall"), "\n\n") } } # 调用函数生成完整歌词 bottles()
关键修改点解释
- 补全数字序列:把
number向量扩展到包含"One",这样循环可以覆盖所有段落,不用单独写额外的判断分支; - 动态匹配下一个数字:通过遍历索引
i,用i+1获取序列中的下一个数字,同时处理最后一个元素(One)的特殊情况,自动切换为"No"; - 单复数适配:针对"One"和"No"的场景调整
bottle/bottles的显示,让歌词语法更准确; - 移除硬编码:彻底替换掉原来固定的
number[2],换成动态生成的next_num,确保每段最后一行的数字完全符合歌词逻辑。
运行这段代码后,每段的最后一行会自动对应正确的下一个数字,从Ten→Nine一直到One→No,完美还原《十只绿瓶子》的歌词内容!
内容的提问来源于stack exchange,提问作者Ane
相关产品推荐
相关产品推荐

