逐位实现以查找R

时间:2018-01-16 09:22:47

标签: 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. 将res设置为0
  2. 将d设为1
  3. 当(S - res * res)的绝对值大于eps
  4. 时,重复步骤a-d
  5. 将x设为1
  6. 重复以下(res +(x * d))*(res +(x * d))小于或等于S:将x设置为x + 1
  7. 将res设置为res +(x - 1)* d
  8. 将d设为d / 10
  9. 输出结果

1 个答案:

答案 0 :(得分:0)

代码几乎可以,但问题隐藏在细节中。该算法指出:

  • 重复步骤a-d,同时(S-res * res)的绝对值更大 比eps
    • 将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