逐个数字实现以查找 R 中输入的平方根

  • 本文关键字:平方根 查找 数字 实现 r
  • 更新时间 :
  • 英文 :


我正在尝试使用 R 中的逐位算法实现输入的平方根。我在网上找到了一些关于如何做到这一点的伪代码,但似乎我被置于一个无限循环中

    sqrt.by.digit <- function(S, eps=1e-6) { 
    res <- 0
    d <- 1
    while ((S - res * res) > eps) {
      x <- 1
      while ((res + (x * d)) * (res + (x * d)) <= S) {
        x <- x + 1
        res <- res + (x - 1) * d
        d <- d /10
      }
    }
    res
   }
   print(sqrt.by.digit(10, 0.1))
  1. 将分辨率设置为 0
  2. 将 d 设置为 1
  3. 重复步骤 a-d,而 (S - res*res( 的绝对值大于 eps
  4. 将 x 设置为 1
  5. 在 (res + (x * d(( * (
  6. res + (x * d(( 小于或等于 S 时重复以下操作: 将 x 设置为 x + 1
  7. 将 res 设置为 res + (x - 1( * d
  8. 将 d 设置为 d/10
  9. 输出结果

代码几乎没问题,但问题隐藏在细节上。该算法声明:

  • 重复步骤 a-d,而 (S - res*res( 的绝对值更大比每股收益
    • 将 x 设置为 1
    • 在 (res + (x * d(( * (
    • res + (x * d(( 小于或等于 S 时重复以下操作: 将 x 设置为 x + 1
    • 将 res 设置为 res + (x - 1( * d
    • 将 d 设置为 d/10

所描述的内部循环仅提及在满足条件时应执行的一个操作,即 Set x to x + 1 .

因此,从问题实现需要的唯一更改是将括号}移位,以便内部while执行一个操作。

sqrt.by.digit <- function(S, eps=1e-6) { 
  res <- 0
  d <- 1
  while ((S - res * res) > eps) {
    x <- 1
    while ((res + (x * d)) * (res + (x * d)) <= S) {
      x <- x + 1
    }
    res <- res + (x - 1) * d
    d <- d /10
  }
  res
}
sapply((0:10)^2, sqrt.by.digit)
# [1]  0  1  2  3  4  5  6  7  8  9 10

最新更新