递归检查骰子组合:验证R代码是否正确实现指定逻辑
验证连续双6位置检查的R代码逻辑
首先,要验证你的代码是否符合需求,我们先明确需求核心逻辑:遍历所有连续双6的起始位置,对每个位置,从j=2开始依次检查偏移后的位置是否为双6,直到抵达下一个双6的位置或数组末尾。
符合需求的参考实现
# 1. 生成测试掷骰数据(可替换为你的rolls) set.seed(123) rolls <- sample(1:6, 30, replace = TRUE) # 手动插入若干双6便于测试 rolls[c(2,3,5,6,10,11,15,16,20,21)] <- 6 # 2. 获取所有连续双6的起始索引(rolls[i]和rolls[i+1]均为6) double_six_pos <- which(rolls[-1] == 6 & rolls[-length(rolls)] == 6) # 3. 执行需求中的检查逻辑 result_list <- list() for (k in seq_along(double_six_pos)) { current_i <- double_six_pos[k] # 确定当前双6位置的下一个双6位置(最后一个则设为无穷大) next_i <- if (k < length(double_six_pos)) double_six_pos[k+1] else Inf current_checks <- data.frame( current_double_six_start = current_i, j = integer(), check_start_pos = integer(), is_double_six = character(), stringsAsFactors = FALSE ) j <- 2 while (TRUE) { check_start <- current_i + j - 2 # 终止条件:检查位置超出数组范围,或到达下一个双6的起始位置 if (check_start + 1 > length(rolls) || check_start >= next_i) { break } # 判断是否为双6 is_66 <- ifelse(rolls[check_start] == 6 && rolls[check_start + 1] == 6, "yes", "no") # 记录结果 current_checks <- rbind(current_checks, data.frame( current_double_six_start = current_i, j = j, check_start_pos = check_start, is_double_six = is_66, stringsAsFactors = FALSE )) j <- j + 1 } result_list[[k]] <- current_checks } # 合并所有结果 final_result <- do.call(rbind, result_list) print(final_result)
验证你的代码是否正确的要点
你可以从以下几个维度对比自己的代码:
- 双6位置的提取是否正确
- 确认你获取的
double_six_pos是所有满足rolls[i] == 6 & rolls[i+1] == 6的起始索引i,而非其他定义(比如结束索引)。
- 确认你获取的
- 循环终止条件是否正确
- 对每个双6位置,是否以下一个双6的起始位置作为终止检查的边界,避免覆盖下一个双6的检查范围。
- 是否判断了
check_start + 1不超过rolls的长度,防止数组越界。
- 索引计算是否符合需求
- 验证
check_start = i + j - 2的计算是否正确,对应的rolls[check_start]和rolls[check_start+1]是你要检查的位置对。
- 验证
- 结果记录是否完整
- 是否为每个
j值都记录了对应的检查位置和yes/no结果,且每个双6位置的检查结果都被单独存储或合并。
- 是否为每个
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

