当for循环由ArrayList的大小控制时
import Data.Complex
import Data.List (iterate)
{- ... -}
o :: Num (Complex a) => Complex a -> [Complex a]
o c = tail (iterate p iv)
where
iv = 0 -- or "0 :+ 0", if you want to be explicit
p z = z^2 + c
但循环的每次迭代都是在列表中添加一个元素,然后循环如何识别大小正在变化?我认为一旦代码被发送到编译器,它将看到大小一次然后执行直到它达到原始大小,但显然不是这种情况。随着大小的增加,循环运行的次数也会增加。我认为它不会,所以显然我不明白计算机是如何读取它的。我只是想知道系统如何读取这样的东西。
另外,有没有办法让循环只运行原始列表大小的次数(每次迭代再次添加元素)?假设你事先不知道大小,所以你不能输入一些常数。
答案 0 :(得分:7)
在每次迭代开始时,评估中间表达式。如果是,则循环继续。如果为假,则循环中断。因此,它将在每次迭代时重新评估大小。
要使其循环列表原始大小的次数,请执行以下操作:
int size = someArrayList.size();
for (i = 0 ; i < size ; i++) { ... }
或者如果你想得到幻想:
for (i = 0, size = someArrayList.size() ; i < size ; i++) { ... }
答案 1 :(得分:1)
在ArrayList中实现add()方法时,会更新存储arraylist大小的成员变量,而size()表示此成员变量的getter,因此在每次迭代时调用此大小,以便获得更新版本的大小。
答案 2 :(得分:1)
每次迭代都会调用.size()
。这就是循环遍历迭代器的原因,如果你只是在循环永远不会结束时评估.hasNext()
。要仅在列表上迭代原始大小的次数,您可以执行以下操作:
final int originalSize = list.size();
for (int i = 0; i < originalSize; i++) {
...
}