北京理工大学金旭亮老师C#(37—Factorial)

软件开发中的递归

// 一个构成递归调用的函数
static void DonotRunMe()
{
    DonotRunMe();  //递归就是自己调用自己
}

小知识:堆栈溢出(StackOverflow)

  • 程序代码其实是由“线程(Thread)”负责执行的。
  • OS在创建线程(Thread)时,会给每个线程配套一块内存区域,线程可以用这块区域存储一些数据。
  • 这块内存区域被称为“线程堆栈(thread stack)”
  • 线程堆栈有容量限制,当一个线程要保存的数据超过了这个容量时,就发生了“堆栈溢出”

“递归(recursive)”的算法

  • 代码要处理的数据或计算量在递归前后不断递减

实例:编个程序求n!

static int Factorial(int N)
        {
            int ans=1;
            if (N <= 1)
                return 1;
            else
                ans = N * Factorial(N - 1);

            return ans;
        }

小结:递归编程的套路

  1. 每个递归函数的开头一定是判断递归结束条件是否满足的语句(一般是if语句)
  2. 函数体一定至少有一句是自己调用自己的
  3. 每个递归函数一定有一个控制递归可以终结的变量(通常是作为函数的参数而存在)。每次自己调用自己时,此变量会变化(通常是变小),并传送给被调用的函数。

递推

static long Factorial2(int N)
        {
            long ans = 1;
            for (int i=1;i<=N;i++)
            {
                ans = ans * i;
            }
             return ans;
        }

递归vs递推

  • 递归是从后到前再回来
  • 递推是从前到后
  • 递归和递推是等价的

猜你喜欢

转载自blog.csdn.net/weixin_42681308/article/details/88853556
今日推荐