我正在尝试使用 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))
- 将分辨率设置为 0
- 将 d 设置为 1
- 重复步骤 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
- 输出结果
代码几乎没问题,但问题隐藏在细节上。该算法声明:
- 重复步骤 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