C#基础(12)递归函数

news/2024/9/19 20:12:27 标签: c#, 开发语言, 算法

前言

我们先前已经做了好几个函数的知识补充,今天将会是最后一个函数知识的补充:递归函数。

递归这个东西,看着吓人,其实很简单。我们先来问下gpt让他解释一下吧。

递归函数是一种函数,它在其定义中调用自身。在每次调用时,递归函数会将问题的规模缩小,直到达到基本情况(即不再需要进行递归调用的情况),然后开始返回,并将每个递归调用返回的结果合并以解决问题。

递归函数通常有两个部分:基本情况和递归调用。基本情况是一个停止递归的条件,当满足这个条件时,递归函数会返回一个确定的值。递归调用是指在函数内部调用自身,但是每次调用时,问题的规模会缩小。

递归函数在解决一些问题时非常有用,因为它可以将复杂问题拆解为较小的子问题。通过递归调用来解决这些子问题,最终可以得到整个问题的解。然而,递归函数需要谨慎使用,因为它可能导致无限递归的问题,即递归函数无法停止调用自身。为了避免这种情况,必须确保递归函数在每次调用时都能逐步接近基本情况。

基本概念

根据上述的一些简介,你会觉得很抽象,但是我可以很简单地将这个东西概括成:

让函数自己调用自己,这就是递归函数。

重点:

  • 必须有结束调用,不然会进入死循环
  • 用于条件判断的条件必须自己改变

实例

这个东西我个人觉得道理就是这么简单,我们更多来看两个例子来感受一下递归的作用。

static void Fun(int a)
{
    Console.WriteLine(a);
    ++a;
    
    if(a>10)//设置结束条件,当a大于10递归结束
    {
        return;
    }

    Fun(a);//进入递归
}

 你可以在VS里尝试这个函数,然后运行后你就能感受到效果。

现在我们来看一个更难的例子,也是大家经常会涉及到的一个例子,使用递归实现斐波那契数列求和的代码:

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到递归函数的魅力,他可以节省很多代码量,提高代码复用性,重要的是,他在树形结构问题的解决上起着至关重要的位置(树是一种数据结构)。

总结

想毕你通过这两个例子,就能很好感受到递归的基本概念,但我觉得你如果需要加强自己对代码的理解,那一定要去尝试多练题,多写代码,而不是眼睛一看,脑子一过就完了,那样就算你很聪明,当时看懂了,过段时间你遇到一个稍微复杂的问题就未必会用。

所以,踏实学习。

请期待我的下一篇博客!


http://www.niftyadmin.cn/n/5658447.html

相关文章

LangChain基本使用

1.主要功能和应用场景 LangChain 的一些主要功能和应用场景: 构建自己的聊天机器人:使用 LangChain 的 LLM(大型语言模型)接口、提示模板和记忆选项,可以开发一个能够保留对话历史记录的聊天机器人。 特定文档的问答功能:通过为自己的文档创建索引,可以在文档中进行检索…

Linux内核编译并移植至ARM平台

Linux内核编译并移植至ARM平台 Linux系统相关概念操作系统的启动过程获取树莓派源码Linux内核源代码目录树结构 树莓派Linux源码配置树莓派Linux内核编译移植内核至树莓派 Linux系统相关概念 操作系统的启动过程 x86&#xff0c;Intel的启动过程&#xff1a; 电源上电 -> B…

92、K8s之ingress下集

一、ingress 1.1、两种部署方式 1、ingress------------deployment nodeport ​ daemonset hostnetwork----每台设备只能有一个pod&#xff0c;因为直接使用宿主机的端口&#xff0c;所以只能开启一个pod。 2、ingress------svc------deployment里面的pod&#xff0c;这种…

喧嚣漫天之际,重新审视以太坊的定位与路线图

价值捕获很重要&#xff0c;但现在讨论为时尚早。 作者&#xff1a;Mike Neuder&#xff08;以太坊基金会研究员&#xff09;&#xff1b;译者&#xff1a;Azuma&#xff1b;编辑&#xff1a;郝方舟 出品 | Odaily星球日报&#xff08;ID&#xff1a;o-daily&#xff09; 编者按…

最新热点!结合创新!小样本学习+CLIP:超好上手的思路,爽发顶会顶刊

今天给大家推荐一个很好上手的创新思路&#xff1a;小样本学习CLIP。 这个思路的优势在于&#xff1a;通过利用CLIP模型强大的跨模态表征能力&#xff0c;再结合小样本学习技术&#xff0c;我们就可以在仅提供少量标注样本的情况下&#xff0c;快速适应新的任务&#xff0c;在…

Whizard:跨越 Thanos 从开源项目到生产就绪的鸿沟

此文是根据 KubeSphere 在 KubeCon China 2024 上的演讲分享整理而成。 议题简介 作为最受欢迎和强大的 Prometheus 长期存储项目之一&#xff0c;Thanos 被社区广泛采用。但要在生产环境中使用 Thanos&#xff0c;仍然需要自动化许多繁杂的运维工作。 在这次演讲中&#xff0c…

yolov8 rect batch_shapes 672 图像大小变化

遇到这样一种情况&#xff1a;img_sz640,但在val时&#xff0c;输入网络的张量h和w是672 为什么输入图像会从640变大到672&#xff1f; 这是因为一种rectangle增强方法&#xff0c;“同个batch里做rectangle宽高等比变换&#xff0c; 加快训练 &#xff0c;对于多余的黑边做到…

C#使用TCP-S7协议读写西门子PLC(四)

接上一篇,我们连接PLC并握手成功,并且封装生成读写PLC的命令 C#使用TCP-S7协议读写西门子PLC(三)-CSDN博客 这里我们进行读写基础数据类型、读取DB块的字符串、宽字符串、以及一系列连续数组。 新建部分类文件SiemensS7ProtocolUtil.Integrated.cs 主要方法 读取任意连续…