工作积累之递归方法的实质和普遍意义

来源:互联网 发布:外汇对冲套利 知乎 编辑:程序博客网 时间:2024/05/14 21:13
 从方法论意义上说,递归方法是一种从简单到复杂、从低级到高级的可连续操作的解决问题的方法。它的每一步骤都是能行可操作的,各步骤之间是连续转换的。递归定义是用简单的、自明的要素描述、构造、说明复杂的整体。递归方法是通过解决简单的问题来解决复杂的问题。在人们的思维过程中,普遍存在着递归机制。递归方法是一种处理问题的精致技巧、解决问题的有效方法。从哲学方法论角度研究递归方法,具有重要的意义。
    递归定义和递归方法是逻辑学、数学、计算机科学(程序设计)中经常运用的定义和方法,它们具有精确的含义,特别在解决某些困难问题时很有效,它仿佛是一种有趣而精巧的加工器,能使问题得到完满解决。在人的思维活动中,也普遍存在递归现象和递归机制。对于某些问题,只能用递归方法来处理;对于某些问题,用递归方法处理比其他方法更有效。在计算机程序中,递归可以构成一种自动推理机制。人工智能的主要问题之一,就是让计算机具有自动推理的功能。建立了一种“递归机制”后,一旦输入初始值(前提)计算机就可以进行自动推理而得到结果(结论)。递归方法是一种处理问题的精致技巧、解决问题的有效方法。

一、“递归”概念
    所谓递归(来自拉丁文recurso,原意指往回跑、召回等)是指借助于“回归”而把未知的归结为已知的。所谓递归函数是一种数论函数,就是说这种函数的定义域和值域都是自然数,并且对未知数值的计算往往是要回归到已知数值才能求出。递归是一种循环结构,它把“较复杂”情形的计算,递次地归结为“较简单”情形的计算,一直归结到“最简单”情形的计算,并得到计算结果为止。这就是递归的实质。对于定义是递归的,数据结构是递归的,问题的解法是递归的,都可以采用递归方法来处理。

“递进”的定义:一个对象部分地由自己组成,或按照自己的定义来定义自己,则称其为递归。

根据这个定义,可以把递归的类别分为以下几种:

(1)递归函数:
    定义:一个函数是递归的,若在它的定义中又出现了定义本身的应用的话。

例如,阶乘函数N!的递归定义为:

Ⅰ 0!=1 (N=0时)
Ⅱ N!=(N-1)!×N (N>0时)

这里:
Ⅰ是非递归的初始值,是递归终止的判断条件,叫做递归的出口。
Ⅱ中(N-1)!是递归中用较小的自变量表示较大的自变量N!的递归定义,即N!的定义是由它自己的一部分(N-1)!来定义的。
递归函数的定义步骤是:
    先给出一些容易定义的递归函数作为基本函数,它们是零函数、后继函数、射影函数;然后给出一些基本规则,从基本函数出发,通过使用这些规则(可以重复),生成出所有递归函数。
   
(2)递归过程

  
定义 : 一个过程是递归的,若一个过程P包含着对自己的调用,则称P为直接递归的;若P包含着对另一个过程Q的调用,而Q又调用了P,则称P是间接递归的。

   递归法是一种计算函数值的方法,其每一个处理阶段都包含所有后继标记,即第一阶段不能在所有其他阶段结束之前完成。递归函数是用迭代公式从一些自然数导出其值为自然数的一种函数,而该函数是迭代公式中的一个操作数。递归计算是指具有某些检验功能的自我调用进程并使用前一次递归结果得到的数值的过程。一般而言,递归过程是指每一步都要利用以前若干步的结果的一种过程。

(3)递归数据结构:

    一种数据结构是递归的,若它的结构定义中包含着自身的定义。数据结构中的堆栈就是一种递归数据结构。

(4)递归例行子程序

    递归例行子程序是本身可以作为一个例行子程序来使用的一种递归程序,能够直接调用,也能够由另一个自己调用自己的程序加以调用。例如,在计算表达式 N=n!=n×(n-1)×(n-2)……×2×1(即n阶乘)中,n为程序传递参数,若n=1或0,则程序返回值为1,否则程序每次用(n-1)值调用自己,用n乘以调用结果,并返回其乘积。此程序连续反复调用自己,直到传递的参数值等于1为止。当程序值为1返回时,逐次调用获得程序值,最后得出程序值 N=n!。递归程序最常用的调用方法是利用堆栈,使每一次调用时的最近返回地址和任何其他状态信息被推到堆栈出口,堆栈顶部的地址被弹出作为返回地址。所以,递归例行子程序是允许自己调用自己的子程序。在每一次后继的调用中,递归例行子程序的状态必须存放起来,表示该状态的数据往往都存入堆栈中,在未转出该子程序之前,可以直接或间接再次调用子程序本身。一个递归程序是由初始值和递归关系一起完成(构成)的。递归方法就是先找出递归关系,并在已知初始值条件下解所得递归方程,求出同项公式,从而得到所需要的结果。

二、递归方法

1.递归论
    亦称“递归函数论”、“能行性理论”。
    它主要是用数学方法研究“可构造性”或“能行过程”的学科。

    各种递归函数本身的构造也是它研究的重要方面。递归论的主要内容包括原始递归函数、一般递归函数、部分递归函数、递归可枚举性、判定问题、递归不可解性理论、α递归论、谱系理论等。递归论的主要方法是通过对数论函数的研究,深刻揭示能行过程的本质,从而有力地解决许多重要的数学问题。

    递归论讨论的是从形式上刻划一个运算或一个进程的能行性这种直观的观念,也就是从原则上讲,它们能机械地进行而产生一个确定的结果。“能行的”(effectify)这个概念含有可具体实现的、有效的、有实效的等等意思。递归的概念并不难理解,它就是由前面的结果可以递推得到后面的结果。递归论所研究的数论函数有精确的数学定义。为示例起见,用递归定义式定义“斐博那奇函数”如下:

初始规定:
f(0)=0,
f(1)=1,
递归运算关系:
f(n)=f(n-1)+f(n-2)。
  
    容易看到,任意给定一个自然数n,f(n)恒可使用上述递归定义式逐步地求得。


    在历史上,对于“能行过程”这一含糊的概念有许多精确的定义。例如,一般递归式,图灵机器,正规算法,有限自动机等。后来发现这些定义彼此都是等价的,从而确认深入研究递归论对弄清“能行过程”是十分关键的。在这一领域做出重要贡献的有希尔柏特、歌德尔、邱奇、图灵、克林尼、波斯特等人。时至今日,递归论已取得了丰硕的成果,它不但在数学基础理论方面有极其重要的应用,而且在其他新兴学科,尤其在电子计算机科学中已越来越显出它的重要性。


2.递归操作序列

    一个项的序列,其中第一个项之后的每一个项都由其前面某些项或所有项作为操作数进行某种运算(操作)而确定,则称它是一个递归操作序列。设第一项为n[,0],运算为F,则有:

(1) n[,0](初始状态)
n[,1]=F(n[,0])
n[,2]=F(n[,1])
……
n[,i]=F(n[,i-1])
(2) n[,0](初始值)
n[,1]=F(n[,0])
n[,2]=F(n[,0],n[,1])
……
n[,i]=F(n[,0],n[,1]…n[,i-1])

这是一个连续操作的过程。从一般意义上说,就是从事物的某一个初始状态开始,对事物连续进行某种操作,使事物的状态发生一系列的变化。不同的是,操作可以始终是同一种,也可以在不同的环节上有不同的操作。用S(State)表示状态,O(Operate)表示操作,则表示为:

(1) S[,0](初始状态)
S[,1]=O(S[,0])
S[,2]=O(S[,1])
……
S[,i]=O(S[,i-1])
在整个过程中进行的是同一种操作O。
(2) S[,0](初始状态)
S[,1]=O[,1](S[,0])
S[,2]=O[,2](S[,1])
……
S[,i]=O[,1](S[,i-1])
在整个操作过程中进行的是不同的操作O[,1],O[,2]……,O[,i]。


3.递归证法

亦称“数学归纳法”,这一方法既简明又有力。例如,我们可以只用递归证法推导出全部初等数论。
递归证法最通常的形式是,为了证明命题A(n)对任意的自然数n成立,我们只需要证明以下两点:
(1)证明A(0)正确,进行代入验证,这一步骤叫做奠基。
(2)假设A(n)正确(这叫做归纳假设),而设法证明A(n+1)也正确,这一步骤叫做归纳。
递归证法还有别的形式,其中好些是与上述递归证法的形式等价的,但也有些力量更强或更弱的证法。需要指出的是,在数学的一个分支——集合论中,当讨论超穷数时,我们往往把递归证法推广到超穷数去而得到超穷递归证法。这种证法也是讨论超穷数时的一个重要工具。而通常所说的递归证法则与递归论有密切的联系。递归证法是一个很重要和很有力的证明方法,它在递归论以及其他数学理论的发展中起了重要的作用。

4.递归定义

    这样的一种定义或许看来令人吃 惊:当定义某一对象时,可以使用尚未完整定义的同一对象?这样的定义叫做递归定义。
    逻辑上它们完全是正确的并且是可理解的。
    递归定义是用递归的方法给一个 概念下定义的方法。
    例如,逻辑学中就是用递归定义方法来定义“合式公式”的。合式公式的定义是:

(1)命题变元A、B等是合式公式;
(2)如果变元A是合式公式,则~A是合式公式;
(3)如果变元A和B是合式公式,则A∧B,A∨B,A→B,A←→B是合式公式;
(4)有限地使用上述(1)、(2)、(3)规则所构成的符号序列都是合式公式。

    这就是用递归的方法给“合式公式”下的定义,即递归定义。这里就是用“合式公式”来定义“合式公式”,即“自己定义自己”。
递归定义是一种自我循环吗?是“循环定义”、“同语反复”吗?从普通逻辑的角度看,“自己定义自己”就是循环定义,是违反定义的规则的。这二者之间有着本质的区别。递归定义往往用来表示(定义)一种传递关系。
递归定义的实质反映了人类思维的有限性、起始性。在一定层次上、一定阶段上,对某一个具体思维过程来说,总是要有一个起始点,这个起始点往往是一种“自明” 的预设,直接承认它,对它不再作解释和定义,以它作为思维进程的起点。人的思维不可能无限地往前追朔,否则,任何一个思维过程都无法进行和完成。
递归定义的一般含义:某个起始对象具有某种性质,对它进行某种变换(操作)后得到一个新对象,该新对象也有这种性质。或者说,某个复合对象(整体)具有某种性质,是由它的构成单元对象(部分)具有这种性质所决定的。例如,说A∨B是合式公式,是由A、B都是合式公式决定的。


三、递归的实质

    递归包含着还原。
    所谓“还原”就是找到最基本的初始元素和最基本的操作步骤。递归方法与可操作性问题相关。
    可递归的,就是可还原的,也就是可操作的。
    某些问题的解决是一个有始有终、环环紧密相联的过程中,要得到最终结果,必须从第一步做起,任何一步都不能缺少;任何相邻的两步,前一步完成之后才能完成后一步。这样的问题就必须用递归方法来解决。

    从一般意义上说,递归方法是一种从简单到复杂、从低级到高级的可连续操作的解决问题的方法。它的每一步骤都是能行可操作的,各步骤之间是连续转换的。递归定义是用简单的、自明的要素描述、构造、说明复杂的整体。递归方法是通过解决简单的问题来解决复杂的问题。在人们的思维过程,存在着递归机制。对于某些问题必须用递归方法来定义或解决。

    递归方法从事物的联系、连续变换的角度研究问题,它研究的一系列对象或对象的一系列状态之间不是孤立的,而是联系的、能行转化的,一个对象产生出另一个对象、对象的一个状态产生出(转化为)另一个状态。如:
n[,1],n[,2]=f(n[,1]),n[,3]=f(n[,2]),……
n[,2] 由n[,i]产生出来,n[,3]由n[,2]产生出来,……这些对象是一个相互联系的序列。人的思维中包含着“能形性机制”。这是思维的一个基本性质,否则思维将无法进行。逻辑思维具有能形性。直觉、顿悟也具有能形性机制,只不过还没有发现而已。“能形性”就是“递归性”。“能行性”是思维过程得以进行的前提,没有“能行性”,思维活动的各环节之间就无法转化,任何一种过程内部都存在着“能行性”机制。
递归论中的“可计算性”,从数学上说,就是从一个数计算出另一个数,从一般意义上说,这种“可计算性”就是可操作性、可转化性,即从一个对象产生出另一个对象、从一种状态产生出另一种状态。从逻辑上说,递归也是一种推理。递归方法在能行性理论(判定问题、不可解性等)的研究中起了重要的作用。递归方法也叫递推法,这是一种寻找数学规律和解题思路的重要方法。
   
     算法是递归论中的重要概念。

     所谓算法一般被看成是针对一类问题的统一处理规则。这时的“统一处理”意指这种规则并非对每个具体问题的单独性处理,而是适用于一类问题。算法是由有穷个语句组成的,当给出一类问题中的任一问题后,可以能行地执行这些规则,经有穷步后得到答案。算法的定义是:一个算法是一个作为计算程序(并不必定是数值的)的明晰的能行的指令集,用它可以找到给定的一类问题中的任一个问题的解答。直观地说,能行就是机械,能行的方法就是机械的方法,其中没有任何随意性。描述得切近些,是指它的每一步都由某个事先给定的规则(计算程序)明确规定了的,即规则规定了第一步如何作,并且也规定了在某一步之后下一步如何作;同时要求这个过程要在有穷步内完成。递归算法的特点:一个递归算法就是在定义中使用自己的算法。递归是一种重要的概念,有了它,就可以使用函数或过程自己来定义该函数或过程。

    递归定义,就每一个具体规则来看,它是简单机械的,但它们汇成的整体功能却超出了人们的想象。递归定义的功能是按固定方式自动地由上一代生成下一代,由下一代生成下下一代。虽然其“生成”方式固定不变,但是输入的“原材料”不同,生成的 “后代”一般也不同。递归定义是一个“加工器”。一个递归定义就是给出一组规则(法则),由这些规则确定某一类对象组成的一个集合。这些规则中的第一条规定某些对象属于该集合,其余各条都规定如果某些对象属于该集合,那么另外的一个怎样的对象也属于该集合。
递归定义具有这样的特点:要证明由归纳定义所确定的某一类对象中的每一个都有某个性质,只需证明满足定义中陈述的规则的对象都有该性质。例如,要证明一个形式系统的每一定理都有性质P,只需要证明满足对定理的定义规则的公式都有性质P。换句话说,只需要证明:
(1)形式系统的每一公理都有性质P;
(2)如果一个推理规则的所有前提都有性质P,那么规则的结论也有性质P(推理规则保持性质P)。这也叫做“推理规则的遗传性”。
用这个方法所作的证明称为对于定理的归纳证明。(1)称为基始;(2)称为归纳步骤。(2)中的假设:推理规则的所有前提都有性质P,称为归纳假设。归纳证明是一个很重要、应用很广的证明方法。
递归论的基本内容是讨论“算法可计算”或“能行可计算”函数类。可计算性是和算法概念精确化共生的。在计算机科学理论中有两个理想的可计算的形式构造系统。一个是瑟(Thue)系统,它纯粹是一个形式系统,在这个系统中,符号序列可以作为其他的符号序列依靠某些规则的推论而“演绎”出来。这样,给出一个输入序列后,这些规则允许转换出一个输出序列。这是一种形式信息处理系统。另一个是图灵机,图灵机对算法概念的计算特征作了深入到细节的刻划。图灵机是一种理想的计算机,它是一个用数学方法精确地加以定义的,且能反映计算程序这个概念的抽象系统。图灵机把计算时用到的要素都恰当地转换为某种基本程序,把计算归结为最基本的要素,最后用形式的程序表达出来。

    “递归”是一种普通的思维机制,但在不同的科学领域中它又表现为一些特殊的现象、特殊的方法。在方法论研究中,虽然我们不可能寻找到一种能解决所有问题的万能方法,事实上这样的方法也是不存在的,但我们可以对不同科学领域中的问题进行分类,从抽象化问题过渡到具体化问题,使问题的定义和描述精确化,从而寻求解决某一类问题的精确方法(即算法)。在各种科学领域中以至在社会结构中、人们的各种操作行为中,普遍存在一类具有递归结构的问题,我们把这类问题称为“递归问题”。递归方法就是解决这类“递归问题”的精确方法