• 递归的简单解释 Anthony


    最简单的递归具有这样的形式

    fn = a | fn

    它的结果就是 a

    计算过程如下,是一个数学归纳法.

    递归次数) 表达式
    1)        fn = a
    2)        fn = fn = a
    ....
    n)        fn = fn =...(n - 1 次)= fn = a

    所以fn = a

    写成C语言就是:
    #define a          1

    int fn(int n)
    {
        if( n == 0) return a;
        return fn(n - 1)
    }

    n == 0 是递归终止条件, 当它一定能成立时, a 称为吸收子, fn 是递归过程.

    当吸收子不含有递归过程(直接或间接)时称为 有限递归. 程序设计中的递归都必须是
    有限递归.

    不论递归过程如何定义,其关键都产生吸收子.整个递归的过程,实际上就是生成一个
    参数数列A = { fn(n=1), fn(n = 2), .... fn(n=n-1)}.
    其结果就是以吸收子和参数数列为自变量的一个函数: F(a, A).

    上例中, fn(n) 的参数就是n, 参数数列就是A = { n, n - 1, n - 2, ..., 0}
    函数F(x, y) = x.所以结果为0.

    再举个例子:

    void fn ( int n, int sum)
    {
       if(n == 0) return;

       printf("n = %d, sum = %d", n, sum)
       fn(n - 1, sum + n);
       printf("n = %d, sum = %d", n, sum)
    }

    这个递归过程
    A = {n, sum}, {n - 1, sum + n}, {n - 2, sum + n + n - 1}, ... { 0, sum + n*n - 1 - 2 ... - (n - 1)}
    a = 空

    F(x, y) = 空.

    结果只是打印出了A数列

    不过这个例子说明了一个问题, F(x,y)实际上作用了两次. 第一次以A顺序, 第二次以A的逆序.

    第一次发生在生成A数列过程中,第二次发生在销毁A的过程中.
    实际上它说明了递归的栈本质.

    就是说所有的递归函数都可以改写成非递归的函数(使用栈).
    如上题:

    struct A
    {
       int n;
       int sum;
    };

    #define N = 30; //最大栈深
    void fn(int n, int sum)
    {
       A stack[N];
       int i = n;

       stack[n].n = n;
       stack[n].sum = sum;
       printf("n = %d, sum = %d", stack[i].n, stack[i].sum);

       while(i)
       {
          stack[i - 1].sum = stack[i].sum + i;
          stack[i - 1].n = i;

          i--;
          printf("n = %d, sum = %d", stack[i].n, stack[i].sum);
       }

       while(i   {
          printf("n = %d, sum = %d", stack[i].n, stack[i].sum)
          i++;
       }
    }
    可以运行的程序见下:

    #include <stdio.h>

    void fn ( int n, int sum)
    {
       if(n == 0) return;

       printf("before n = %d, sum = %d/n", n, sum);
       fn(n - 1, sum + n);
       printf("after n = %d, sum = %d/n", n, sum);
    }

    struct A
    {
       int n;
       int sum;
    };

    #define N  30 //最大栈深

    void fn2(int n, int sum)
    {
       A stack[N];
       int i = n;

       stack[n].n = n;
       stack[n].sum = sum;

       while(i)
       {
          stack[i - 1].sum = stack[i].sum + i;
          stack[i - 1].n = i - 1;
          printf("before n = %d, sum = %d/n", stack[i].n, stack[i].sum);
          i--;
       }

       while(i<n)
       {
          i++;
          printf("after n = %d, sum = %d/n", stack[i].n, stack[i].sum);

       }
    }

    int main()
    {
    fn(5, 0);
    fn2(5, 0);
    }

  • 相关阅读:
    使用JDBC连接MySql时出现:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration
    Mysql Lost connection to MySQL server at ‘reading initial communication packet', system error: 0
    mysql-基本命令
    C# 监听值的变化
    DataGrid样式
    C# 获取当前日期时间
    C# 中生成随机数
    递归和迭代
    PHP 时间转几分几秒
    PHP 根据整数ID,生成唯一字符串
  • 原文地址:https://www.cnblogs.com/ahuangliang/p/5309290.html
Copyright © 2020-2023  润新知