惊爆!某编程师因递归无限调用引发电脑爆炸!

目录

目录

  1. 1 定义
  2. 2 介绍
  3. ▪ 一个条件的例子
  4. ▪ 条件
  5. 3 计算
  6. 4 例子



定义

一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的。用递归过程定义的函数,称为递归函数,例如连加、连乘及阶乘等。凡是递归的函数,都是可计算的,即能行的 [1]
 

古典递归函数,是一种定义在自然数集合上的函数,它的未知值往往要通过有限次运算回归到已知值来求出,故称为“递归”。它是古典递归函数论的研究对象 [1] 。



介绍

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

其他等价的函数类是λ-递归函数和马尔科夫算法可计算的函数。




一个直接的例子

1

2

3

4

5

6

7

8

9

//代码1

void func()

{

//...

if(...)

func();

else

//...

}




条件

一个含直接或间接调用本函数语句的函数被称之为递归函数,在上面的例子中能够看出,它必须满足以下两个条件:

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)

}



计算

函数的概念是一个很一般的概念。在定义函数时,不一定要具体给出通过自变量求函数值的方法。因此,可将函数分成两类,一类是所谓能行可计算函数,另一类是非能行可计算的函数。这前一种函数无论在理论上或在实际上都是非常重要的,因此人们便试图给它们以精确的数学刻画。递归函数便是许多这种刻画中的一种 [2]
 。

我们以下考虑的函数都是从自然数到自然数的函数。

我们先定义几个初等函数

(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)

注意,μ算子可以将一个全函数变换成一个部分函数(即在自然数的某个子集上有定义的函数)。

可以看出,上述所有算子都是将能行可计算函数变换为能行可计算函数。

所谓递归函数类便是包含零函数、广义幺函数,并在复合算子、递归算子,μ-算子下封闲的最小函数类。

容易相信,任何递归函数都是能行可计算的。反过来,是否存在直观上能行可计算的,但不是递归的函数呢?人们直到现在还没有发现这样的函数。相反,人们证明了,现已遇到的直观上能行可计算的函数都是递归函数。进一步,人们还证明了,递归函数类与其他的一些刻画能行可计算函数的方法产生的函数类是完全一致的,这些事实促使车尔赤(Church)提出了他的著名的论点:

递归函数类与直观能行可计算函数类是重合的。

这个论点已被大多数递归论学者所接受。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值