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();
这样我们就实现了一行代码返回斐波那契数列列表了
浙公网安备 33010602011771号