编写概率递归函数遇异常:求解满足0.9概率的CPU数量
函数问题排查与修复
原函数的问题所在
- 循环与递归混用导致逻辑混乱:在while循环内调用递归
opcpu(p,q),但未接收递归返回的新p值,当前函数的p仅完成自增,却未同步递归的计算结果,最终引发无限循环或递归栈溢出异常。 - 递归逻辑错误:将递归嵌套在循环中,等于每次循环都重新启动一次递归流程,完全违背了递归的设计思路,既冗余又容易出错。
修正后的纯循环版本
要找到满足概率≥0.9的最小p,用循环实现更直观且稳定:
opcpu <- function(p, q) { if (p < q) { stop("处理器数量必须大于等于", q) # 直接抛出错误比返回字符串更实用 } # 计算初始概率(排列数P(p,q)除以p^q) prob <- prod(p:(p - q + 1)) / p^q # 循环递增p直到概率达标 while (prob < 0.9) { p <- p + 1 prob <- prod(p:(p - q + 1)) / p^q } return(p) }
验证结果
当q=12时,初始p设为12调用函数,会返回预期的631:
opcpu(12, 12) # [1] 631
额外优化:避免数值溢出
当p较大时,直接计算排列数容易出现数值溢出,改用对数计算概率更稳定:
opcpu <- function(p, q) { if (p < q) { stop("处理器数量必须大于等于", q) } # 用对数转换避免大数相乘溢出,log(prob) = 排列数的对数和 - q*log(p) log_prob <- sum(log(p:(p - q + 1))) - q * log(p) while (log_prob < log(0.9)) { p <- p + 1 log_prob <- sum(log(p:(p - q + 1))) - q * log(p) } return(p) }
内容的提问来源于stack exchange,提问作者Tamimi
相关产品推荐
相关产品推荐

