传参数的方式 递归 20140830

一、传参数的方式

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:递归类似于迭代法,但运算顺序不同,迭代是利用已知条件得出公式求值;而递归则是按照顺序利用公式推算至最后结果,再利用已知条件遍历求值.

 

转载于:https://www.cnblogs.com/DORCASQING/p/3947944.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值