前言
我们先前已经做了好几个函数的知识补充,今天将会是最后一个函数知识的补充:递归函数。
递归这个东西,看着吓人,其实很简单。我们先来问下gpt让他解释一下吧。
递归函数是一种函数,它在其定义中调用自身。在每次调用时,递归函数会将问题的规模缩小,直到达到基本情况(即不再需要进行递归调用的情况),然后开始返回,并将每个递归调用返回的结果合并以解决问题。
递归函数通常有两个部分:基本情况和递归调用。基本情况是一个停止递归的条件,当满足这个条件时,递归函数会返回一个确定的值。递归调用是指在函数内部调用自身,但是每次调用时,问题的规模会缩小。
递归函数在解决一些问题时非常有用,因为它可以将复杂问题拆解为较小的子问题。通过递归调用来解决这些子问题,最终可以得到整个问题的解。然而,递归函数需要谨慎使用,因为它可能导致无限递归的问题,即递归函数无法停止调用自身。为了避免这种情况,必须确保递归函数在每次调用时都能逐步接近基本情况。
基本概念
根据上述的一些简介,你会觉得很抽象,但是我可以很简单地将这个东西概括成:
让函数自己调用自己,这就是递归函数。
重点:
- 必须有结束调用,不然会进入死循环
- 用于条件判断的条件必须自己改变
实例
这个东西我个人觉得道理就是这么简单,我们更多来看两个例子来感受一下递归的作用。
cs
static void Fun(int a)
{
Console.WriteLine(a);
++a;
if(a>10)//设置结束条件,当a大于10递归结束
{
return;
}
Fun(a);//进入递归
}
你可以在VS里尝试这个函数,然后运行后你就能感受到效果。
现在我们来看一个更难的例子,也是大家经常会涉及到的一个例子,使用递归实现斐波那契数列求和的代码:
csharp
using System;
public class Program
{
public static void Main(string[] args)
{
int n = 10; // 要计算的斐波那契数列的项数
int sum = FibonacciSum(n);
Console.WriteLine($"斐波那契数列的前{n}项和为:{sum}");
}
public static int Fibonacci(int n)
{
if (n == 0)
{
return 0;
}
else if (n == 1)
{
return 1;
}
else
{
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}
public static int FibonacciSum(int n)
{
int sum = 0;
for (int i = 0; i <= n; i++)
{
sum += Fibonacci(i);
}
return sum;
}
}
在Main
方法中,我们声明一个变量n
,表示要计算的斐波那契数列的项数。然后调用FibonacciSum
方法计算斐波那契数列的前n
项和,并将结果打印出来。
Fibonacci
方法用于计算斐波那契数列的第n
项。如果n
为0,则返回0;如果n
为1,则返回1;否则,递归调用Fibonacci
方法来计算第n - 1
项和第n - 2
项的和。
FibonacciSum
方法用于计算斐波那契数列的前n
项和。它通过循环调用Fibonacci
方法来计算每一项,并将它们累加到sum
变量中。最后返回sum
作为结果。
这段代码对初学者会有一些难度,但是我相信你只要花时间去理解,一定能get到递归函数的魅力,他可以节省很多代码量,提高代码复用性,重要的是,他在树形结构问题的解决上起着至关重要的位置(树是一种数据结构)。
总结
想毕你通过这两个例子,就能很好感受到递归的基本概念,但我觉得你如果需要加强自己对代码的理解,那一定要去尝试多练题,多写代码,而不是眼睛一看,脑子一过就完了,那样就算你很聪明,当时看懂了,过段时间你遇到一个稍微复杂的问题就未必会用。
所以,踏实学习。
请期待我的下一篇博客!