递归与栈

递归函数有2部分组成:结束条件和递归条件。

结束条件:函数不再调用自己,避免形成无限循环。

递归条件:函数调用自己。

 

例如:让你写一个倒计时的函数

>5 , 4, 3, 2,  1

    /// <summary>
    /// 递归
    /// </summary>
    public class Recursive
    {
        /// <summary>
        /// 倒计时 错误实例
        /// </summary>
        public static void CountDown(int times)
        {
            Console.WriteLine(times);
            CountDown(times - 1);
        }
    }

如果你运行上述代码,你会发现 这个函数运行起来没完没了,无休止的打印 ... 。

所以编写递归函数,你必须告诉它何时停止递归,即停止条件

        /// <summary>
        /// 倒计时 正确实例
        /// </summary>
        public static void CountDown(int times)
        {
            if (times <= 0) //停止条件
            {
                return;
            }
            Console.WriteLine(times);
            CountDown(times - 1);
        }

  

  嗯,很好,符合预期!

 

栈:使用递归,你必须理解栈这个概念。

假设你要去野外烧烤,为此你写了一摞待办清单。

 

 新写的放在最上面;读取的时候,也是读取最上面那一个,完成事项 并将其撕毁 扔掉。

因此待办清单有2个操作:

1.新写的放在最上面,压入。

2.读取完成最上面的 将其扔掉,读取并删除。

这种操作 在数据结构中我们称之为栈。是不是很简单,所以栈是一种简单的数据结构。

我们来看看计算机是如何使用调用栈的:例如函数

        public static void Hello(string name)
        {
            Console.WriteLine("Hello" + name + "!");
            HowAreYou(name);
            Console.WriteLine("goodbye !");
            Bye();
        }
        public static void HowAreYou(string name)
        {
            Console.WriteLine("How are you , " + name + "?");
        }
        public static void Bye()
        {
            Console.WriteLine("OK Bye!");
        }

  例如我们调用函数 Hello( " 熊二 "),此时计算机首先为该函数调用 在内存中分配一块内存。

    

每当你调用函数,计算机都会想这样将函数调用涉及到的所有变量的值 存储在内种中。

然后我们又调用了函数HowAreYou( 熊二 ) 同样又分配一块内存:

在计算机中用一个栈存储这些内存块。第二个函数位于第一个函数的上面。

 那么我们打印出来了How are you,熊二。 HowAreYou函数调用结束。此时,,栈顶部的内存块 被弹出。

现在栈顶部的内存块是函数Hello 。

 现在我们又回到了 函数Hello 。此时我们整个函数Hello 还没有结束 ,下面还有打印函数、及Bye函数。

从函数内的代码块调用另外一个函数时,当前函数暂停 处于未完成状态。

然后往下执行:打印出 goodbye ,再调用Bye 函数。

在栈顶部添加了函数Bye的内存块。打印出 OK ,bye! 然后从栈顶部 弹出。又回到了 Hello 函数:

 下面没有别的事情要做了,我们也从函数Hello 返回。

递归函数也使用调用栈。

使用栈很方便,但也要付出代价:需要存储详尽的信息,可能会占用大量的内存。

总结:

递归是指 调用自己的函数。

每个递归函数都有2个条件:结束条件和递归条件。

栈有2中操作:压入和弹出。

所有函数的调用都进入调用栈。

调用栈可能很长,将占用大量的内存。

 

原文地址:https://www.cnblogs.com/zhaolaosan/p/15204334.html