C#一行代码返回斐波那契数列列表

本文章代码基于.NET 6编写

斐波那契数列是很多教材用来教递归的经典案例

一般是写一个返回斐波那契数列的第n个数的函数,如下:

int fibonacci(int n)
{
    if (n < 0) throw new("n不能小于0");
    if (n <= 1)
    {
        return n;
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
}

 如果想写成一行代码,可以使用lambda表达式和三目运算,如下:

int fibonacci(int n) => n < 0 ? throw new("n不能小于0") : n <= 1 ? n : (fibonacci(n - 1) + fibonacci(n - 2));

 

但是今天我想的是能不能用一行代码返回一个斐波那契数列列表呢?

返回前n个斐波那契数,代码如下:

List<int> fibonacciList(int n)
{
    if (n <= 2)
    {
        return Enumerable.Range(1, n).ToList();
    }
    var last = fibonacciList(n - 1);
    return last.Append(last[^1] + last[^2]).ToList();
}

如果n是5,那么返回的是List [1, 1, 2, 3, 5]

我们使用lambda表达式和三目运算,依然可以用一行代码实现:

List<int> fiboList(int n) => n <= 2 ? Enumerable.Repeat(1, n).ToList() : fiboList(n - 1).Append(fiboList(n - 1)[^1] + fiboList(n - 1)[^2]).ToList();

 可是,上述一行代码一次Append就要调用三次递归,效率非常低

 

如果能把fiboList(n-1)保存下来,那么只需调用一次递归就可以了

如果我们使用模式匹配,就可以实现一次Append只调用一次递归,代码如下:

List<int> fiboList(int n) => n <= 2 ? Enumerable.Repeat(1, n).ToList() : fiboList(n - 1) is List<int> li ? li.Append(li[^1] + li[^2]).ToList() : throw new();

这样我们就实现了一行代码返回斐波那契数列列表了

posted @ 2022-03-17 20:42  qwabcdpo  阅读(244)  评论(0)    收藏  举报