zoukankan      html  css  js  c++  java
  • 递归函数最终会结束,那么这个函数一定?

    题目如下:

    递归函数最终会结束,那么这个函数一定(不定项选择):
    1. 使用了局部变量 2. 有一个分支不调用自身
    3. 使用了全局变量或者使用了一个或多个参数

    这是一道简单的选择题,但包含的内容并不算简单,而不定项选择更加大了难度。我一眼看去,自然就选择了2和3。
    1显然不是,局部变量只在一次调用局部范围有效,出了这次调用的范围就无效了,它不能控制递归的结束。(这个选项是考查局部变量生命周期/有效范围的问题)需要注意的就是局部变量不是局部静态变量。
    对于2,很自然了,如果没有一个分支不调用自身,递归就不会结束了。(这是在考查递归的定义)
    对于3,这是最有迷惑性的,因为使用全局变量或使用一个或多个参数的确可以控制递归的结束,但是不是只有这两种方式呢?所以题目中指出了"一定"。答案是并不是只有这两种方式。

    • 我们知道局部静态变量存放在堆中而不是栈中,所以它在程序生命周期内都是存在的,只是只有在函数内才能被访问,其内容是上次处理后的内容或是初始化后的内容,调用多次都同一个变量实例。所以局部静态变量是可以控制递归函数最终结束的。
      在C语言中,可以用
      static int a;
      来定义,在Delphi中可以用
      const a:integer;
      来定义(注意编译器开关$J+)
      这里会有很多人认为局部静态变量就是全局变量,这是错误的,全局变量应该是生命周期和有效作用域都有全局性,而局总静态变量只有生命周期是全局的,而作用域是只在函数体内有效。
    • 可能通过异常来控制递归的结束。其实这种情况很常见,每个应用程序的缺省栈空间大小是不会太大的,很容易因为堆栈溢出而让递归函数终止。此外,还可以会发生其它的异常,比如内存空间不足、除零等等。这些异常都可以让递归函数终止。
    • 我们一般所说的全局变量都是针对一个应用程序而言的,所以我们还可以利用BIOS或OS的一些数据或一些标准库的全局值来控制递归过程的终止。比如利用日期时间、利用库中的随机数等等。
    • 我们还可以把一些数据写入到BIOS或OS的系统数据区,也可以把数据写入到一个文件中,以此来控制递归函数的终止。
    • 还有......还没想到

    呵呵,所以,正确答案是2,只有这一个。


    以上终止条件,我只想到前两个,后面的是综合了其他人的"创意":D

    转自:http://blog.sina.com.cn/s/blog_632fdaf60100k58l.html

  • 相关阅读:
    国内DP厂家的相关资料信息
    【转】挟天子以令诸侯博客关于TCP/IP模型与OSI模型的区别
    TMS320CC657基本外围电路调试
    TMS320C6657双核DSP的图像处理系统开发(1):硬件相关tips
    TI c6657开发资源
    PCIE接口的说明
    Flash Builder4注册机
    myeclipse 方法上加上@Override就报错的处理方法
    oracle安装完成后目录中不论有没有tnsnames.ora和listener.ora文件 PLSQL都能连上的问题解决方法
    POJO和javabean的区别
  • 原文地址:https://www.cnblogs.com/freewater/p/2696415.html
Copyright © 2011-2022 走看看