• 递归函数


    在数学上,关于递归函数的定义如下:对于某一函数f(x),其定义域是集合A,那么若对于A集合中的某一个值X0,其函数值f(x0)由f(f(x0))决定,那么就称f(x)为递归函数。

    数理逻辑和计算机科学中,递归函数或μ-递归函数是一类从自然数到自然数的函数,它是在某种直觉意义上是"可计算的" 。事实上,在可计算性理论中证明了递归函数精确的是图灵机的可计算函数。递归函数有关于原始递归函数,并且它们的归纳定义(见下)建造在原始递归函数之上。但是,不是所有递归函数都是原始递归函数 — 最著名的这种函数是阿克曼函数
    其他等价的函数类是λ-递归函数和马尔可夫算法可计算的函数。

    一个直接的例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //代码1
    void func()
    {
    //...
    if(...)
    func();
    lse
    //...
    }

    条件

    一个含直接或间接调用本函数语句的函数被称之为递归函数,在上面的例子中能够看出,它必须满足以下两个条件:
    1) 在每一次调用自己时,必须是(在某种意义上)更接近于解;
    2) 必须有一个终止处理或计算的准则。
    例如:
    梵塔的递归函数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //C
    void hanoi(int n,char x,char y,char z)
    {
    if(n==1)
    move(x,1,z);
    else
    {
    hanoi(n-1,x,z,y);
    move(x,n,z);
    hanoi(n-1,y,x,z);
    }
    }
    阶乘的递归函数,公式如下:
     
    1
    2
    3
    4
    5
    6
    7
    8
    //C++
    int Factorial(int n)
    {
    if(n==0||n==1)
    return 1;
    else
    return n * Factorial(n-1)
    }
    我们先定义几个初等函数
    (1)零函数 Z(x)=0;
    (2)后继函数 S(x)=x+1;
    (3)广义幺函数 U1n(x1,…xn)=xi;
    显然,上面这些函数都是能行可计算的。
    再介绍几个将函数变换为函数的算子。
    (1)复合算子 设f是n元函数,g1…gn是m元函数,复合算子将f,g1…gn变换成为如下的m元函数h:
    h(x1…xm)=f1g1(x1,…xm),…gn(x1,…xm))
    (2)递归算子 设f是n元函数 (≥0),g是n+2元函数,递归算子将f,g变换成满足下列条件的h+1元函数h:
    h(x1,…,xn,0)=f(x1,…xn)
    h(x1,…xn,y+1)=g(x1,…xn,y,h(x1,…xn))
    (3)μ一算子,设f是n+1元函数,如果存在y,使f(x1,…xn,y)=0,我们以μyf(x1…xny)表示这样的y中的最小者,如果使f(x1…xny)=0的y不存在,我们说μyf(x1,…xny)无定义。μ-算子将n+1元函数f变换成下面的几元函数h
    h(x1,…xn)=μyf(x1…xny)
    注意,μ算子可以将一个全函数变换成一个部分函数(即在自然数的某个子集上有定义的函数)。
     
  • 相关阅读:
    Thymeleaf学习记录(1)--启动模板及建立Demo
    Redis教程基本命令
    错误:Attempted to load applicationConfig: [classpath:/application.yml] but snakeyaml was not found on the classpath
    备注
    MYSQL建表问题(转)
    Class.forName("com.mysql.jdbc.Driver")找不到类
    mySql连接报错
    电脑启动过程
    C++输入输出流--<iostream>详解
    类内部实例化自身可行吗?
  • 原文地址:https://www.cnblogs.com/jiaxinchao/p/10154265.html
Copyright © 2020-2023  润新知