这里的巡回重复

  1. 三遍自调用的结果,应该是下一回调用的开始值

 

 

标题:一位赶着鸭子去各种村庄卖,每经过二个聚落卖去所赶鸭子的一半又一只。那样她透过了八个村落后还剩五只鸭子,问他出发时共赶多少只鸭子?

  1. 澳门太陽城集团登录网址,大主题素材能拆分等价于小难点的巡回重复(必须)

澳门太阳集团城网址,阐释: 斐波那契数列 1、1、2、3、5、8、13、21、34 

这里的巡回重复,和常见的loop 语句不太一样,在代码中显示为艺术的自调用。

 

        public static double FactorialWithRecursion(int n) 
        {
            if (n > 1)//明确终止条件
            {
                Console.Write(n+"*");
                return n * FactorialWithRecursion(n - 1);
            }
            else //当不满足终止条件时的处理,即断开自我循环调用的点
            {
                Console.WriteLine(1);
                return 1;
            }
        }

 

  1. 应用题

 

1.
首先大家开采难点中有句话“每经过七个村庄卖去所赶鸭子的十分之五又三只”,能够看来那句话评释了那是叁个双重的长河。

浅显的说正是能把大主题材料等价于一个不是难点的轮回重复,从而通过解决一个小标题来达到减轻大难题的目标。

澳门太陽城集团登录网址 1

种种算法的妄图,永恒是程序员的供给利器。

斐波纳契数列以如下被以这里的巡回重复。递归的法子定义:F(1)=1,F(2)=1,
F(n)=F(n-1)+F(n-2)(n>=2,n∈N*这里的巡回重复。这里的巡回重复。)

 1. 阶乘

递归算法(recursion
algorithm)在计算机科学中是指一种通过重复将标题解释为同类的子难题而化解难题的不二等秘书诀。

读者能够团结尝试着去贯彻那三种不一样的办法。

这里的巡回重复。那边使用的是叁个正向思维,即F(n) = F(n-1)+F(n-2).
上海教室中并不是三个名特别减价的实现,可是福利通晓。

  1. 最卓越的递归难点,斐波那契数列。

澳门太陽城集团登录网址 2

鲜明,循环的历程必须有贰个决定典型来断开循环,不然就可以非常循环下去。

简单的说的说,当n>=2时,当前数是前多少个数值相加的结果。

3.
再看“经过了多少个村落后还剩八只鸭子,问他出发时共赶多少只鸭子“,能够得出那是贰个依据结果推出开端规范的标题。

这里的巡回重复。为此,能够使用且相应利用递归算法的应用场景,个人归咎为三点:

2.
在解析上边那句话,“卖去所赶鸭子的二分之一又贰只”,那表明了再也的持筹握算方法,可是这里有三种构思方法:

因而抽离重复的代码,能够革新为如下。

让我们来看几个例证,并且相比使用递归算法以及不利用递归的出入,明白一下接纳递归的心路历程。

在那些事例个中,就反映了自家在上文提到的第三点,三遍函数调用的结果,是下一遍函数调用的开端值。

 

借使开端有X只鸭子,等式为 [(x/2-1)/2 -1]/2 -1…= 2; 重复进度为result
=(result/2 -1), 出口即为重复天数,直到天数为零

再也调用的进程归结为,result = previous + result;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="targetNumberIndex">指定斐波那契数列第几位</param>
        /// <param name="previous">前一个数的值</param>
        /// <param name="currentResult">当前累加结果</param>
        /// <param name="currentNumberIndex">当前累加到第几位</param>
        /// <returns></returns>
        public static double FibonacciWithRecursion(int targetNumberIndex, int previous = 1, int currentResult = 1, int currentNumberIndex = 2)
        {

            if (targetNumberIndex > 2 && currentNumberIndex <= targetNumberIndex)
            {
                currentNumberIndex += 1;
                Console.WriteLine(currentResult);
                var temp = currentResult;
                currentResult = currentResult + previous;
                return FibonacciWithRecursion(targetNumberIndex, temp, currentResult, currentNumberIndex);
            }
            else 
            {
                return 1;
            }
        }

一旦从结果推出初阶标准,等式能够写为,[(2+1)*2+1]*2 +1… = x;
重复进程为result = (result*2 +
1),出口为重复天数,直到天数等于给予的天数7

末段附上一张自制显示递归进程的图

2.
有支配规范(称为出口)来断开自己调用,大概接续笔者调用,调节原则并不一定是简轻松单的剖断语句,能够有三种情形大概三个规范(必须)

2)计算剩下的鸭子数量, y=x/2-1;

1) 总计发卖的鸭子数量,y=x/2+1;

        //n*(n-1)*(n-1-1)*(n-1-1-1)...
        //解析n *(n-1) *(n-1-1)
        //阶乘的过程归纳为一个乘法运算的重复 *(n-1)
        public static double FactorialWithRecursion(int n) 
        {
            var result = 1;
            int temp;

            if (n > 1)
            {
                result = n * (n - 1);
                {
                    temp = n - 1;
                    if (temp > 1)//可以看到往下都是一个重复的过程,可以看作是一个递归方法调用的展开 
                    {
                        result = result * (temp - 1);
                        temp = temp - 1;

                        if (temp > 1) 
                        {
                            result = result * (temp - 1);
                            temp = temp - 1;

                            if (temp > 1) 
                            {
                                result = result * (temp - 1);//可以把重复的代码抽离出来写出一个方法
                                ...
                            }
                        }
                    }
                }
                return result;
            }
            else 
            {
                return result;
            }
        }

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图