今天要写的是C#的重载和递归,先吧他们的区别和作用罗列出来吧
首先是:重载 用过c#的Console.WriteLine();的人应该都知道 这是是在控制台输出一些我们
编写的东西,当我在编码中对WriteLine进行F12的操作时如下:
那么为什么我们最常用的WriteLine有这么多种可以用的方法呢? 我试试把光标指向WriteLine时:
这里显示有17个重载方法,而且名字都是同一个 ,下面就开始讲为什么要这样:先上代码
class Program
{
static void Main(string[] args)
{
Console.WriteLine("输入一个分钟数吧");
int minutes = int.Parse(Console.ReadLine());
Console.WriteLine(CountSeconds(0,1));//方法的重载,方法名称相同,参数列表相同
}
//根据分钟数计算秒数
private static int CountSecondsByMinute(int minute)
{
return minute * 60;
}
//根据分钟数,小时数,输出总秒数
private static int CountSecondsByMinuteAndHour(int minute, int hour)
{
return CountSecondsByMinute(minute + hour * 60);
}
//根据分钟数,小时数,天数,计算总秒数
private static int CountSecondsByMinuteAndHourAndDay(int hour, int minute,int day)
{
return CountSecondsByMinuteAndHour(minute, hour + day * 24);
}
从这里分割开来 我们可以看到上面是我们用方法的嵌套来让用户输入天数,小时,或者是分钟
来达到我们获取多少秒的要求,但是有一个缺点就是,每一次我想调用秒的时候,是不是只能
用这三种里面的一种方法去带入
比如: CountSecondsByMinuteAndHourAndDay(1,1,1);
又或者是: CountSecondsByMinuteAndHour(1,1);
这里我们要达到的目标都是一样的,但是我们获取秒用的方法是不是多了?
而且一多可能就难记住
所以我们可以用 下面的 **重载** 简而言之呢,就是把我们可以达到一个目的的多个方法,名字设
定为一样,然后层层套用,这时候,我们再用起来就像Console.WriteLine时侯一样了。
大家可以把代码拿去试一试,看看鼠标放在CountSeconds这个方法的时候 会不会出现效果
private static int CountSeconds(int minute)
{
return minute * 60;
}
//根据分钟数,小时数,输出总秒数
private static int CountSeconds(int minute, int hour)
{
return CountSeconds(minute + hour * 60);
}
//根据分钟数,小时数,天数,计算总秒数
private static int CountSeconds(int hour, int minute, int day)
{
return CountSeconds(minute, hour + day * 24);
}
}
好了这里是分割线,记录完重载了,开始记录递归
递归:递归是一种可以把比较难的东西化而简之的方法 ,是一个方法内部又调用自身的过程
核心思想:将问题转移给范围缩小的子问题
优势:将复杂的问题简单化,一步步缩小然后化成子问题
缺点,每一次调用都会在内存里面开辟出一块空间来进行计算,对于优化不是一个好的选择
而且递归一般上是面试的时候考算法时用,真正项目中作用不是很大
看代码:
static void Main(string[] args)
{
GetValue(9);
GetFactorial(3);
}
private static int GetFactorial(int num)
{
if (num == 1) return 1;
//方法内部又调用自身的过程
//核心思想:将问题转移给范围缩小的子问题
//优势:将复杂的问题简单化 虽然会占用空间,一步步缩小然后化成子问题
return num * GetFactorial(num - 1);
}
private static int GetValue(int num)
{
if (num == 1) return 1;
if (num % 2 == 0)
return GetValue(num - 1) - num;
else
return GetValue(num - 1) + num;
}
}
第一个是阶乘 第二个是输入1+2-3+4-5.。。。。。的效果,大家感兴趣可以自己试一试,自己打断点判断他的运行。