.Net学习笔记3-.Net基础1.3 方法与递归

asp.net中TreeView控件的递归呈现方法 asp.net 1.x下的TreeView递归呈现:CREATE TABLE [T_File_Menu] (    [ID] [varchar] (3) COLLATE Chinese_PRC_CI_AS NOT NULL ,    [Context] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,    [HrefUrl] [varchar 阅读详情
1.方法简介
方法(Methon).或函数(Function)
方法主要格式:
返回值类型 方法名(参数类型 参数1,参数类型 参数2……)

{

}
目前来讲所有方法都先加上static,以后讲why
封装一下GetMax方法:
static int GetMax(int[] nums)//参数的名字只在方法内部使用,和调用方法中的参数名字无关
{
int max=num[0];
for(int i=1;i<nums.Length;i++)
{
int num=nums[i];
if(num>max)
{
max=num;
}
}
return max;//把执行结果返回
}
调用方法: GetMax(x);
方法就是一堆可以重复使用(复用)的代码段。
执行过程中无法确定的数据以参数形式传递;方法的执行结果以返回值进行返回。不能在方法中定义方法。
方法可以没有参数;方法可以没有返回值(void)。
return:方法中用return返回处理结果,执行return之后方法内部的代码就执行结束了
如果没有返回值,则在需要执行结束的地方return;如果没写return,则在最后一句return;
方法中的局部变量不能被调用的方法访问,如果真要访问只能通过参数传值,
并且只是相当于变量赋值,方法内部对参数的赋值不会影响调用者。方法也不能调用调用者的局部变量。
一个问题:不是所有路径都有返回值。
必须方法的所有执行路径都要有返回值
2.方法重载(OverLoad)
两个方法名字相同,参数不同才能构成重载,和返回值无关;
编写一个获得String[]最长元素的方法GetMax
static string GetMax(string[] nums)
{
string max=num[0];
for(int i=1;i<nums.Length;i++)
{
string num=nums[i];
if(num.length>max.length)
{
max=num;
}
}
return max;//把执行结果返回
}
重载(OverLoad):在同一个类中,允许存在一个以上的同名方法,只要其参数个数或者参数类型不同即可。
返回值是否一样无关。如果只是参数名字不一样,也不能构成合法的重载。
即:只有参数类型或者个数不一样,方法才能重名,和参数的名字、返回值类型都没有关系。
编译器怎么样知道应该调用哪个?
只调用参数类型相同的方法;GetMax(string[])调用第二个,GetMax(int[])调用第一个
之前我们用过的方法重载。Console.WriteLine()
3.可变长度数组(params):
int sum(params int[] nums);
就可以这样自由调用sum(3,5);sum(3,9,11,22,5);
这些参数其实还是以数组形式传递过去,在sum看来也是数组,
只不过编译器会自动把参数封装为数组,简化了调用。通过神器ILSpy可看出
可变参数可以声明为各种类型:test1(String... values)
可变参数前面还可以有其他参数,
可变长度参数params,params必须是最后一个参数,而且是数组类型;
sum(int name,params string[] data)。
4.i++  ++i  i=i+1的区别:
i++:先取值再自增
++i:先自增再取值
i=i+1:赋值表达式也是一个值,这个值就是赋值之后=号左边的值

高效率的学习:
同一时间只做一件事情

一件事情一次性完成


5.递归:(面试重点:阶乘和斐波数列的递归算法和非递归算法)
递归:方法自己调用自己
两个条件:递推方法;递归的终止条件:什么情况下不再递归。
static void JGS(int i)
 {
            Console.WriteLine("从前有座山...讲的什么故事呢?" + i);
            if (i <= 5)
             {
            i++;
           JGS(i);//c#代码中执行完第一行代码才会继续往下执行第二行代码,被调用的方法执行完返回后才会往下继续执行
           Console.WriteLine("讲完了"+i);
             }
             
             }
如果没有终止条件,会一直执行下去,直到抛出异常(StackOverflowException):栈内存溢出,
每执行一次JSG(i),都会在栈里面创建一块内存储存int i
每次调用方法,都会为方法创建一块内存空间,一个方法的两次调用就会有两块内存空间
他们的局部变量是不互相影响的、是独立的
c#代码中执行完第一行代码才会继续往下执行第二行代码,被调用的方法执行完返回后才会往下继续执行
阶乘:
//递推方法:f(n)=n*f(n-1)    5!=5*4*3*2*1
//终止条件: n=0 return 1
static int JC(int n)
        {
            if (n < 0)
            {
                throw new Exception("n不能是负数");
            }
            if (n == 0)
            {
                return 1;
            }
            return n * (JC(n - 1));
        }
斐波那契数列:
//1,1,2,3,5,8,13,21.....第n位(从0开始)值是多少?
        //递推方法:f(n)=f(n-1)+f(n-2)。终止条件:n=0,1 return 1。
        static int fib(int n)
        {
            if (n < 0)
            {
                throw new Exception("n不能是负数");
            }
            if (n == 0 || n == 1)
            {
                return 1;
            }
            return fib(n - 1) + fib(n - 2);
        }
//n从1开始计算
private static int Fib4(int n)
        {

            if (n < 1)
            {
                throw new Exception("n需大于0");
            }
            if (n == 1 || n == 2)
            {
                return 1;
            }
            return Fib(n - 2) + Fib(n - 3);
        }
递归的缺点:效率低,占内存  有的递归算法可以转为非递归算法
当你无法预测到底要递归多少次的时候用非递归算法更加恰当
非递归算法:
阶乘:
static int jiecheng2(int n)
        {
            if (n < 0)//参数合法性校验是面试时候的加分项!
            {
                throw new Exception("n不能是负数");
            }
            //n=3 n*(n-1)*(n-2)*1=3*2*1*1
            int result = 1;
            for (int i = 1; i <= n; i++)
            {
                result = result * i;
            }
            return result;
        }
菲波数列:
private static int Fib2(int n)
        {
            if (n < 0)
            {
                throw new Exception("n不能为负数");
            }
            if (n == 0 || n == 1)
            {
                return 1;
            }
            int[] nums = new int[n+1];
            nums[0] = 1;
            nums[1] = 1;
            for (int i = 2; i < n+1; i++)
            {
                nums[i] = nums[i-1] + nums[i-2];
Console.WriteLine(string.Join(",",nums));//string.Join把一个集合用某个分隔符拼接起来,成为字符串
            }
            return nums[n];
        }
private static int Fib3(int n)
        {
            if (n < 0)
            {
                throw new Exception("n不能为负数");
            }
            int i1 = 1;
            int i2 = 1;
            int i3 = 0;
            for (int i = 1; i < n; i++)
            {
                i3 = i1;
                i1 = i2;
                i2 = i1 + i3;
            }
            return i2;
        }
五个让你的.NET程序“原地爆炸”的递归陷阱 摘要:递归编程的陷阱优化方案 本文通过真实案例揭示了递归编程中的四大致命问题:栈溢出、死循环、内存泄漏和性能灾难,并提供了对应的解决方案。 栈溢出:未定义终止条件导致无限递归,需强制添加终止条件并限制递归深度。 死循环:递归参数未更新引发无限调用,须确保每次递归缩小问题规模。 内存泄漏:未释放资源(如文件流),应使用using语句或显式释放。 性能灾难:重复计算(如斐波那契数列),可通过记忆化缓存或迭代优化。 关键建议:优先使用尾递归或迭代替代深度递归,监控内存调用栈,并通过单元测试覆盖边界条件。 (字 阅读详情

相关推荐

.net 递归算法 .net 递归算法.net 递归算法

.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法

.net 递归

.NET 中的递归是指在程序中调用自身的一种算法。递归算法通常被用来解决问题的多个子问题,其中每个子问题的解决方案都是通过解决其他较小的子问题来实现的。在 .NET 中,可以使用递归函数来实现递归算法。 举个例子,假设我们要计算阶乘(n!)。递归函数可以按照如下方式实现: int Factorial(int n) { if (n == 0) { return 1; ...

weixin_42577243的博客 442

asp.net TreeView递归循环子节点生成树形菜单实例

本文实例讲述了asp.net TreeView递归循环子节点生成树形菜单的方法。分享给大家供大家参考,具体如下: 这里主要用到递归循环获取子结点 /// <summary> /// 生成根节点 /// </summary> /// <param name=treeview></param> protected void BindTreeView(long ID, TreeView treeview) { DataTable dt = menuLogic.GetMenu2(ID, User.Identity.Name); treeview.Nodes.Clear();

Asp.Net递归算法

static void Main(string[] args) { int i = 300; int j; j = Sum(i); Console.WriteLine(j); Console.ReadKey(); } public static int Sum(int n) { int s; ...

weixin_45381269的博客 793

【四】、递归

一、递归介绍 1递归的概念 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。、 2、递归调用机制 3递归需要遵守的重要规则 二、递归面试题 1、迷宫问题 package com.narwal.recursion; public class MiGong { public static void main(String[] args) { int[][] map = new int[8][7]; for (i

weixin_41449756的博客 415

方法的使用递归

Java方法的理解使用递归的过程分析

m0_69025993的博客 461

一、.Net基础1.8】递归

1.什么是递归? 方法自己调用自己。两个条件:递推方法递归的终止条件:什么情况下不再递归。 2.案例1:阶乘      //阶乘:5!=5*4*3*2*1。6!=6*5*4*3*2*1。f(n)=n*f(n-1) static int JieCheng(int n) { //把栈内存填满了 ...

306

C#实现递归方法

什么是递归函数/方法? 任何一个方法既可以调用其他方法也可以调用自己,而当这个方法调用自己时,我们就叫它递归函数或递归方法。 通常递归有两个特点: 1. 递归方法一直会调用自己直到某些条件被满足 2. 递归方法会有一些参数,而它会把一些新的参数值传递给自己。 那什么是递归函数?函数和方法没有本质区别,但函数仅在类的内部使用。以前C#中只有方法,从.NE...

weixin_33675507的博客 8303

基于递归残差U-Net的医学图像分割

基于深度学习(DL)的语义分割方法在过去几年中一直提供最先进的性能。更具体地说,这些技术已成功地应用于医学图像分类,分割和检测任务。一种DL技术,U-Net,已经成为这些应用中最流行的技术之一。本文提出了一种递归U-Net模型和一种递归残差U-Net模型,分别命名为RU-Net和R2 U-Net。所提出的模型利用了U-Net、残差网络和递归卷积神经网络的强大功能。使用这些建议的架构进行分割任务有几个优点。首先,残差单元有助于训练深度架构。其次,使用递归残差卷积层进行特征积累,确保了分割任务的更好特征表示。

qq_45880982的博客 1431

递归方法调用

递归方法调用 开发工具关键技术:Visual Studio + .Net 撰写时间:2019年6月6日 1、一个方法可以自我调用。这就是所谓的递归。下面的实例使用递归函数计算一个数的阶乘: using System; namespace _07递归方法调用 { class NumberManipulator { //调用方法 public i...

梦幻小龙虾 348

10.1.1避免尾递归的堆栈溢出

10.1.1避免尾递归的堆栈溢出   对于每一个函数调用,运行时分配一个栈帧(stack frame)。这些帧保存在由系统维护的栈中;调用完成,栈帧被删除;如果函数调用其他函数,那么,一个新的帧添加到这个栈的顶部。栈的大小是有限的,所以,太多的嵌套函数调用会耗光了给其他栈帧的空间,就不能再调用下一个函数了。在 .NET 中发生这种情况时,会引发 StackOverflowException 错

心想事成 4267

.Net.Net中使用Linq递归查询数据

前言 在业务中经常会遇到递归算法, 比如需要根据上下级关系递归查找所有组织机构,并通过树形在前端展示 递归方法 /// <summary> /// 使用递归方法 /// </summary> /// <param name="treeNodes">所有数据(没有层级)</param> /// <param name="resps">通过递归最终形成层级数据</pa

光影8号的专栏 1225

.net 递归相关思路

递归使用场景 多见于 有上下级关系不止1层得数据 想一层层得查出来 多见于用树状图展示 一:在存数据得时候 考虑 在存数据得时候 用一个字段code 来代表层级 比如4位代表一层 0001 00010001 000100010001 依次类推 那就是需要写个获取编码的方法 来确保关系以及唯一code /// <summary> /// 获取编码 /// </summary> /// <param na...

Marzlam的博客 540

.net6 递归树形和反向递归

4.根据写的封装递归直接使用。2.写一个要输出的DTO。树形无限分下级 菜单。

GO_godan的博客 310

递归算法详解

前言 递归是算法中一种非常重要的思想,应用也很广,小到阶乘,再在工作中用到的比如统计文件夹大小,大到 Google 的 PageRank 算法都能看到,也是面试官很喜欢的考点 最近看了不少递归的文章,收获不小,不过我发现大部分网上的讲递归的文章都不太全面,主要的问题在于解题后大部分都没有给出相应的时间/空间复杂度,而时间/空间复杂度是算法的重要考量!递归算法的时间复杂度普遍比较难(需要用到归纳法等),换句话说,如果能解决递归的算法复杂度,其他算法题题的时间复杂度也基本不在话下。另外,递归算法的时间复杂度不少

yygr的博客 4539

递归算法这样介绍,想不通过面试都难

递归算法是指在函数或过程的定义中使用自身的方法。在递归过程中,一个问题被分解为一个或多个相同或类似的子问题,并且这些子问题会被递归地求解,直到达到最基本的子问题,再利用已知的结果合并解决整个问题。递归的定义是指在函数或过程的定义中使用自身的方法递归的实现方式是在函数或过程内部调用自身。

qwert 1783

C#.NET常见算法

【代码】C#.NET常见算法。

房东的猫的博客 1363
上一篇: .Net学习笔记2-.Net基础1.2 循环与数组
下一篇: .Net学习笔记4-C#面向对象基础1 类和属性
Wynn_nn
博客等级 码龄14年 5粉丝 8原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值