一、传参数的方式
1.传值:是将a的值传给b,在b的值运算改变原来值的时候a不受影响;像复制黏贴,虽然值相同,但是两个独立的个体,任何一个值产生变化另一值不受其影响,不改变.
PS:传值只包括值类型不包含引用类型.
例1:求Main函数1,Main函数2,Add函数1,Add函数2的值.
{
//不返回值 static void add(int n) { Console.WriteLine("add函数1,{0}", n);//Two,再将a的值传给n,5. n = n + 10; Console.WriteLine("add函数2,{0}",n);//Three,运算后再赋值给n,15. } static void Main3(string[] args) { int a=5; Console.WriteLine("Main函数1,{0}",a);//One,计算机先执行Main函数,5. add(a); Console.WriteLine("Main函数2,{0}", a);//Four,但a的值不变,5. } }
返回信息:
运算步骤:One→Two→Three→Four,因为传值后两值之间不受影响,所以a传值给n,n运算后a的值不变.
特例:虽然传值方式不包含引用类型中的字符串类型,但传值后得出的结果与值类型的结果一致,常被误以为可以传值.
例2:求Main函数1,Main函数2,Change函数1,Change函数2的值及地址.
{ static void Change(string s) { Console.WriteLine("Change函数1:" + s + s.GetHashCode());//Two,再将str的值传给s,hello world. s = "你好"; Console.WriteLine("Change函数2:" + s + s.GetHashCode());//Three,运算后再赋值给s,你好. } static void Main(string[] args) { string str = "hello world"; Console.WriteLine("Main函数1:" + str + str.GetHashCode());//One,计算机先执行Main函数,hello world. Change(str); Console.WriteLine("Main函数2:" + str + str.GetHashCode());//Four,但str的值不变,hello world. } }
返回信息:
运算步骤:One→Two→Three→Four,由返回信息中可以看到,str传值给s,s运算后地址发生了改变,证明其不是在原来地址上做更改,而是新建一个地址将改变后的值赋值给s.而不是因为传值后两值之间不受影响,所以str传值给s,str运算后s的值不变.
字符串→Char[]字符数组,因为数组的长度不可更改,所以计算机不会判断更改后的字符串是否还能被原有字符串所容纳,即重新建一个字符串,将运算后的值赋值给新的地址里,而原有值依然指向原有字符串的地址,所以原有字符串不会被垃圾回收(当值没有地址指向的时候才会被计算机垃圾回收).
2.传址:static void Add(ref int n) n即为值的地址,a将a的地址传给n后,a与n的地址相同,都同样指向一个值,所以a与n会彼此受影响.
例:求Main函数1,Main函数2,add函数1,add函数2的值.
{ static void Add(ref int n) { Console.WriteLine("add函数1,{0}", n); ////Two,再将a的值传给n,5. n = n + 10; Console.WriteLine("add函数2,{0}", n); //Three,运算后再赋值给n,15.
} static void Main(string[] args) { int a = 5; Console.WriteLine("Main函数1,{0}", a); //One,计算机先执行Main函数,5. Add(ref a); Console.WriteLine("Main函数2,{0}", a); //Four,受传址后n的影响,a的值随之改变,15. } }
返回信息:
运算步骤:One→Two→Three→Four,因为传址后a受n的影响,值改变,所以a与n相等,值为15.
二、递归
递归,必须使用函数,在运算中自己调用自己.
例:公园中有一堆桃子和一只猴子,每一天猴子都吃掉桃子的一半,然后将剩下的一半中扔掉一个坏的,直到第7天,桃子只剩下一个,求第1天有几个桃子.
{ static int TaoZi(int day)//猴子吃桃的天数 { if (day == 7)//当猴子吃桃的天数为第7天的时候 { return 1;//返回桃子个数为1 } int n = (TaoZi(day + 1) + 1) * 2;//桃子个数等于后一天的桃子个数加上丢掉的一个再乘以2. return n; } static void Main(string[] args) { //递归 int n = TaoZi(1);//计算机先执行Main函数,桃子第一天的个数等于n. Console.WriteLine("公园里有{0}个桃子", n); }
}
返回信息:
PS:递归类似于迭代法,但运算顺序不同,迭代是利用已知条件得出公式求值;而递归则是按照顺序利用公式推算至最后结果,再利用已知条件遍历求值.