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

  • 相关阅读:
    cs11_c++_lab4a
    cs11_c++_lab3
    cs11_c++_lab2
    cs11_c++_lab1
    Oracle 11.2.4.0 ACTIVE DATAGUARD 单实例安装(COPY创建备库)
    无备份恢复(归档模式)
    rman datafile恢复(归档模式)
    GHOST(幽灵)重大漏洞
    Windows Linux 之间rsync同步CODE文件
    Centos 6.5 SNMP客户端安装及配置版本net-snmp-5.7.3
  • 原文地址:https://www.cnblogs.com/DORCASQING/p/3947944.html
Copyright © 2020-2023  润新知