Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看个问题:计算矩形中正方形的周长。
提问
图中显示了 6 个正方形,其边长分别为 1, 1, 2, 3, 5, 8。很容易看出,这些正方形的周长之和为: 4 * (1 + 1 + 2 + 3 + 5 + 8) = 4 * 20 = 80 。
当有 n + 1 个正方形按照图中相同的方式排列时,你能否给出一个函数,返回矩形中所有正方形的周长之和:
例:
input:5
output:80
input:7
output:216
模板:
fn perimeter(n: u64) -> u64 {
todo!()
}
分析
观察图中正方形的边长,1,1,2,3,5,8,如果再往后,就是13,21···,对!这个就是斐波那契数列,该题总结下来,其实就是求 n + 1 项斐波那契数列的和乘以 4 。关于斐波那契数列,可以参考[炼手Rust]斐波那契序列。 我们在此基础上修改下代码,加入求和即可。
解决方案
fn perimeter(n: u64) -> u64 {
let (mut a, mut b) = (1u64, 1u64);
let mut step = 0;
let mut sum = 0;
loop {
sum += a;
let t = a + b;
a = b;
b = t;
step += 1;
if step > n {
break sum * 4;
}
}
}
Trick
loop循环相当于while true。- 跳出循环
break,在rust中,break后面可以跟表达式,该表达式可以作为loop循环的返回值。又因为loop循环是该函数的最后一行,所以作为了该函数的返回值。