我最近在阅读其他人的剧本时遇到了很多。下面是一个简短的例子: 假设我们需要输入并将它们存储在var A和B中,方案如下:
int ok;
ok = false;
while(!ok){
//ask input for A
//ask input for B
ok = true;
}
我明白它想要什么,但为什么这个方案是必要的?我可以只“询问输入A和B”。
答案 0 :(得分:2)
但为什么这个方案是必要的?
没有必要。
我是否只能“询问A和B的输入”。
你确定可以。
但是,如果用户为您提供的输入无效(例如:您要求用户年龄,并且他们输入“马”),那么您可能想再次询问。允许重新输入输入通常是一个有用的功能。重复一段程序的规范控制结构是一个循环。
然而,您的示例程序无条件地设置> library(Matrix)
> library(expm)
> A = matrix(3,2,2)
> B = Matrix(A,sparse=TRUE)
>
> # changed lapply to rep list
> `%^^%` = function(x, k) Reduce(`%*%`, rep(list(x), k))
> # per Roland for loop approach will be better on memory
> `%^^%` = function(x, k) {for (i in 1:(k - 1)) x <- x %*% x; x}
>
> as.matrix(B%^^%2)
[,1] [,2]
[1,] 18 18
[2,] 18 18
> A%^%2
[,1] [,2]
[1,] 18 18
[2,] 18 18
,因此在这种情况下,循环实际上没有用处。只有在输入正常之前必须传递某种形式的验证时,循环才有意义。
答案 1 :(得分:1)
如果您省略的代码中没有检查,但是您在整个地方都看到了相同的构造,那么它就是一个复制和粘贴工件。
有人有一段代码正在读取输入并验证它,然后将代码复制到其他地方,删除了验证位,剩下的就是原样。然后他们将这些代码复制并粘贴到所有地方。
根据我的经验,这种情况经常发生。