循环,第一部分:while
你的阶乘实现被迫采用了递归方法。
如果你来自函数式编程背景,这对你来说可能感觉很自然。或者,如果你习惯了C或Python这样的命令式语言,这可能会觉得有些奇怪。
让我们看看如何使用循环来实现相同的功能。
while
循环
while``循环是一种在条件为真时执行代码块的方法。
一般语法如下:
#![allow(unused)] fn main() { while <condition> { // code to execute } }
例如,我们可能想计算1到5的数字之和:
#![allow(unused)] fn main() { let sum = 0; let i = 1; // "while i is less than or equal to 5" while i <= 5 { // `+=` is a shorthand for `sum = sum + i` sum += i; i += 1; } }
这会持续将1加到sum
上,直到i
不再小于或等于5
为止。
mut
关键字
上面的例子直接放在这里是不会编译的。你会得到一个错误,类似于:
error[E0384]: cannot assign twice to immutable variable `sum`
--> src/main.rs:7:9
|
2 | let sum = 0;
| ---
| |
| first assignment to `sum`
| help: consider making this binding mutable: `mut sum`
...
7 | sum += i;
| ^^^^^^^^ cannot assign twice to immutable variable
error[E0384]: cannot assign twice to immutable variable `i`
--> src/main.rs:8:9
|
3 | let i = 1;
| -
| |
| first assignment to `i`
| help: consider making this binding mutable: `mut i`
...
8 | i += 1;
| ^^^^^^ cannot assign twice to immutable variable
这是因为Rust中的变量默认是不可变的。
一旦赋值后,就不能改变其值。
如果你想允许修改,就需要使用mut
关键字声明变量为可变:
#![allow(unused)] fn main() { // `sum` and `i` are mutable now! let mut sum = 0; let mut i = 1; while i <= 5 { sum += i; i += 1; } }
这样就能正常编译和运行了。
参考资料
本节练习位于 exercises/02_basic_calculator/06_while