[炼手Rust]计算矩形中正方形的周长

88 阅读1分钟

Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看个问题:计算矩形中正方形的周长。

FibonacciBlocks.webp

提问

图中显示了 6 个正方形,其边长分别为 1, 1, 2, 3, 5, 8。很容易看出,这些正方形的周长之和为: 4 * (1 + 1 + 2 + 3 + 5 + 8) = 4 * 20 = 80 。

当有 n + 1 个正方形按照图中相同的方式排列时,你能否给出一个函数,返回矩形中所有正方形的周长之和: EYcuB1wm.jpg

例:
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

  1. loop循环相当于while true
  2. 跳出循环break,在rust中,break后面可以跟表达式,该表达式可以作为loop循环的返回值。又因为loop循环是该函数的最后一行,所以作为了该函数的返回值。