zoukankan      html  css  js  c++  java
  • 递归与栈

    递归函数有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中操作:压入和弹出。

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

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

     

  • 相关阅读:
    问与答练习20210802
    jmeter向kafka中写入数据 在路上
    jmeter插件地址 在路上
    wav2vec遇到的坑:AttributeError: 'Namespace' object has no attribute 'activation'
    oracle11g+arcgis10.2.2新产品部署注意步骤
    Django OssMediaStorage 手动上传图片文件到阿里云 oss
    Django MySQL中存储表情字符
    Ubuntu conda: command not found
    Python 二进制图片数据, 转换成图片到本地
    k8s集群配置搭建skywalking
  • 原文地址:https://www.cnblogs.com/zhaolaosan/p/15204334.html
Copyright © 2011-2022 走看看