For回圈
循环结构 |
---|
do-while循环 |
while循环 |
for循环 |
foreach循环 |
死循环 |
for回圈(英语:for loop)在电脑科学是一种程式语言的迭代陈述,能够让程式码反复的执行。
它跟其他的回圈,如while回圈,最大的不同,是它拥有一个回圈计数器,或是回圈变数。这使得for回圈能够知道在迭代过程中的执行顺序。
for 回圈的种类
[编辑]传统的 for 回圈 for-loops
[编辑]C语言中传统的for-loop包含三个部分:初始化、条件、递增,这三个部分都是可有可无的。[1]
- 以Java为例:
for (INITIALIZATION; CONDITION; AFTERTHOUGHT)
{
// Code for the for-loop's body goes here.
}
初始化是宣告(或者赋值)任何需要的变数的动作。如果你要使用多个变数,则变数的种类要一致。条件的部分则是检查是否离开这个回圈,也就是让程式码往下执行。如果条件判断为假,则离开回圈。递增在每跑一次回圈都会重复执行一次。
- 在此以Java为例:
for (int i=0; i<100; i++) // Prints the numbers 0 to 99 (and not 100), each separated by a space.
{
System.out.print(i);
System.out.print(' ');
}
System.out.println();
使用指标的for回圈
[编辑]这种形式的for回圈是大多数其他for回圈的变革:他允许除了数字以外的计数方式。他通常用隐含或外显指标的方式呈现,而在此回圈变数会依序表示。以下是一个代表性的例子(语言:Python):
for item in some_iterable_object:
do Something
do Something Else
矩阵化for回圈
[编辑]有一些语言支援比较特别的for回圈,如同它可以同时处理所有的指标in parallel,像是在FORTRAN 95中的for all
语法。
举例来说,在以下的for回圈虚拟码片段,当计算A(i)
的新的值,除了第一个(也就是 i = 2
),A(i - 1)
的参照会得到新的值。
然而,在for all
版本,每个计算都会使用一开始的值,不会更改 A
.
for i := 2 : N - 1 do A(i) := [A(i - 1) + A(i) + A(i + 1)] / 3; next i; for all i := 2 : N - 1 do A(i) := [A(i - 1) + A(i) + A(i + 1)] / 3;
和一般的for回圈可能差距比较大。
应用范例
[编辑]以c语言为例:
for (;;)
printf("just keep going on!");
这个程式码会不断的印出"just keep going on!"。
矩阵赋值:
for(int i=0;i<bound_of_matrix;i++)
matrix[i] = i;
以上给予矩阵 matrix 依序从0到bound_of_matrix-1 的值。
就像巢穴一样,一层包覆一层,所以以下这个程式码一共会执行(bound_of_x)乘上(bound_of_y)次。
for(int i=0;i<bound_of_x;i++)
for(int j=0;j<bound_of_y;j++)
matrix[i][j] = j;
常见的错误
[编辑]无穷回圈
[编辑]这里指的是无意产生的无穷回圈,容易导致当机。
- 以C语言为例:
for (int i=0;i<10;i--)
printf("confused");
超出界限
[编辑]编译器会显示out of bound,通常是指尝试取矩阵界限外的值。
回圈内的变数
[编辑]回圈内的变数在出回圈之后,便无法使用。
发展概论
[编辑]主要缘起为许多需要重复执行的程式码,而不一样的程式语言也会有不一样的语法型式。
1957: FORTRAN
[编辑]在Fortran 的DO
回圈 同等于for回圈。
Fortran的 DO
回圈语法为:
DO label counter = first, last, step
statements
label statement
接下来的两个例子做出来的结果等同于其他语言的三个参数的for回圈。其中变数COUNTER被初始化为1,以1递增,并且到5的时候停下。
DO 9, COUNTER = 1, 5, 1
WRITE (6,8) COUNTER
8 FORMAT( I2 )
9 CONTINUE
Fortran 77 或之后的版本,也可能写成:
do counter = 1, 5
write(*, '(i2)') counter
end do
如果递增为1,则递增的部分可以省略。例如:
* DO loop example.
PROGRAM MAIN
SUM SQ = 0
DO 199 I = 1, 9999999
IF (SUM SQ.GT.1000) GO TO 200
199 SUM SQ = SUM SQ + I**2
200 PRINT 206, SUMSQ
206 FORMAT( I2 )
END
1958: Algol
[编辑]Algol 在Algo158首次正式格式化。
1960: COBOL
[编辑]COBOL在许多努力之下,在1959年终正式格式化。他使用PERFORM 动词,而PERFORM动词有很多功能,像是后来加上的"结构化"的语法,像是 END-PERFORM。忽略宣告和初始化变数的必要,类似for回圈的语法为:
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 1000
ADD I**2 TO SUM-SQ.
END-PERFORM
如果PERFORM有TEST AFTER,这个回圈的执行的结果会有点不同:回圈内的程式会被执行至少一次。
1964: BASIC
[编辑]BASIC 中的回圈有时称为 for-next回圈。
For I = 1 to 5;
Print I;
Next I
1964: PL/I
[编辑]由IBM公司在1950年代发明的第三代高级程式语言, 有些类似PASCAL语言。
- 以下为PLI使用例:
do counter = 1 to 5 by 1; /* "by 1" is the default if not specified */
/*statements*/;
end;
LEAVE 指令可以用来结束回圈,像c语言的break,而ITERATE则像continue。
1968: Algol 68
[编辑]Algol68 很类似现在的for语言了:
FOR i FROM 1 BY 2 TO 3 WHILE i≠4 DO ~ OD
1970: Pascal
[编辑]for Counter := 1 to 5 do
(*statement*);
1972: C/C++
[编辑]for (initialization; condition; increment/decrement)
statement
1972: Smalltalk
[编辑]1980: Ada
[编辑]for Counter in 1 .. 5 loop
-- statements
end loop;
1980: Maple
[编辑]Maple有两种型式的for回圈,一个是指标一定范围的值,另一个是指标一定大小的容器。 第一种:
for i from f by b to t while w do # loop body od;
第二种:
for e in c while w do # loop body od;
1982: PostScript
[编辑]他的for回圈 [initial] [increment] [limit] { ... } for
初始化一个内部的变数, 并且执行到他不大于限制的值(若递增为负则以此类推)。[2]
1 1 6 {STATEMENTS} for
1983: Ada 83 and above
[编辑]procedure Main is
Sum_Sq : Integer := 0;
begin
for I in 1 .. 9999999 loop
if Sum_Sq <= 1000 then
Sum_Sq := Sum_Sq + I**2
end if;
end loop;
end;
1984: MATLAB
[编辑]for i = 1:5
-- statements
end
1987: Perl
[编辑]for ($counter = 1; $counter <= 5; $counter++) { # implictly or predefined variable
# statements;
}
for (my $counter = 1; $counter <= 5; $counter++) { # variable private to the loop
# statements;
}
for (1..5) { # variable impicitly called $_; 1..5 creates a list of these 5 elements
# statements;
}
statement for 1..5; # almost same (only 1 statement) with natural language order
for my $counter (1..5) { # variable private to the loop
# statements;
}
1988: Mathematica
[编辑]Do[f[x], {x, 0, 1, 0.1}]
For[x= 0 , x <= 1, x += 0.1,
f[x]
]
1989: Bash
[编辑]*第一種
for i in 1 2 3 4 5
do
# must have at least one command in loop
echo $i # just print value of i
done
*第二種
for (( i = 1; i <= 5; i++ ))
do
# must have at least one command in loop
echo $i # just print value of i
done
1990: Haskell
[编辑]forM_ [1..5] $ \indx -> do statements
如果你想要用更正式的方式存 [1..5]的内容,一个比较官方的方式为:
import Control.Monad as M
forLoopM_ :: Monad m => a -> (a -> Bool) -> (a -> a) -> (a -> m ()) -> m ()
forLoopM_ indx prop incr f = do
f indx
M.when (prop next) $ forLoopM_ next prop incr f
where
next = incr indx
并且可以这样使用:
forLoopM_ (0::Int) (< len) (+1) $ \indx -> do -- whatever with the index
1991: Oberon-2, Oberon-07, or Component Pascal
[编辑]FOR Counter := 1 TO 5 DO
(* statement sequence *)
END
1991: Python
[编辑]for counter in range(1, 6): # range(1, 6) gives values from 1 to 5 inclusive (but not 6)
# statements
1993: AppleScript
[编辑]repeat with i from 1 to 5
-- statements
log i
end repeat
1993: Lua
[编辑]for i = start, stop, interval do
-- statements
end
这个程式码
for i = 1, 5, 2 do
print(i)
end
即会印出:
1 3 5
1995: Java
[编辑]for (int i = 0; i < 5; i++) {
//perform functions within the loop;
//can use the statement 'break;' to exit early;
//can use the statement 'continue;' to skip the current iteration
}
1995: JavaScript
[编辑]JavaScript 支援像是C语言的三个参数的回圈,并且支援break和continue。
for (let i = 0; i < 5; i++) {
// ...
}
1995: PHP
[编辑]for ($i = 0; $i <= 5; $i++)
{
for ($j = 0; $j <= $i; $j++)
{
echo "*";
}
echo "<br>";
}
1995: Ruby
[编辑]for counter in 1..5
# statements
end
5.times do |counter| # counter iterates from 0 to 4
# statements
end
1.upto(5) do |counter|
# statements
end
1996: OCaml
[编辑]请参考[3]
(* for_statement := "for" ident '=' expr ( "to" ∣ "downto" ) expr "do" expr "done" *)
for i = 1 to 5 do
(* statements *)
done ;;
for j = 5 downto 0 do
(* statements *)
done ;;
1998: ActionScript 3
[编辑]for (var counter:uint = 1; counter <= 5; counter++){
//statement;
}
参考文献
[编辑]- ^ For loops in C++. [2016-03-06]. (原始内容存档于2016-03-05).
- ^ PostScript Language Reference. Addison-Wesley Publishing Company. : 596. ISBN 0-201-37922-8.
- ^ OCaml expression syntax. [2016-03-06]. (原始内容存档于2013-04-12).
https://web.archive.org/web/20180906124543/http://terms.naer.edu.tw/detail/2337520/