You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写概率递归函数遇异常:求解满足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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:50:19