遞歸函數論與程序設計的關係

 

遞歸函數論與程序設計的關係

(2011-08-20 12:55:02)
標籤:

校園

分類: 工作篇

遞歸函數論與程序設計的關係

(劉愛貴高能物理研究所計算中心 北京 2003年)

 

摘要 :遞歸函數論是元計算機科學理論基礎,它與計算機科學的實踐緊密相關。遞歸思想影響了程序設計語言的構造,甚至影響了計算機系統結構。本文根據遞歸函數類的構造過程來論證遞歸與程序設計語言基層控制機制的關係,以及遞歸思想對計算機科學其他一些方面的影響。

關鍵詞 : 遞歸定義 複合 原始遞歸 極小化結構化程序設計 遞歸過程 棧

 

可計算性理論是計算機科學的理論基礎之一,遞歸函數論和圖靈機是其兩大理論支柱。圖靈機是一種抽象計算機,它爲可計算數的計算提供了強的有力的計算手段,是計算機的雛形和馮.諾依曼計算機的理論模型,影響了傳統計算機的設計思想。遞歸函數理論作爲元計算機科學理論基礎,明確了計算機可計算的對象——遞歸函數類。圖靈論題:一個函數是可計算的當且僅當圖靈機是可計算的。而圖靈機可計算的函數正是遞歸函數類,確切地說是一般遞歸函數類。圖靈機和遞歸函數論有着天然的聯繫。遞歸函數論與計算機科學的實踐有着密切的關係,遞歸的思想直接影響了程序設計語言的構造,進一步影響了計算機系統的結構。

遞歸是一種定義對象類的方法,這個方法稱爲遞歸定義。存在一定的原始對象,在被定義的類中,我們給出一些方法,運用這些方法要給定某些已知在類中的對象中,可以產生類中的新對象。被定義的類中的全體成員恰好而且僅僅是那些由原始對象開始,反覆使用所給定的獲取新對象的規則而引進的新對象。這種定義類的方法稱爲遞歸定義。遞歸函數類可以用遞歸來定義,它由原始對象經過複合運算、原始遞歸運算和極小化運算而得到。原始對象是三個最簡單的原始函數:

1、繼函數,S(x)=x+1。

2、零函數,N(x)=0。

3、廣義單位函數,clip_image003 (其中0≤i≤n)。

在這三個原始函數基礎上,我們可以定義出非常豐富的函數類。運算規則有:

1、複合運算。如果已知函數

clip_image005

是所生成類中的成員,那麼函數clip_image007 是由這些函數通過複合運算得到的(圖1)。

clip_image009

圖1 clip_image011 的複合計算的操作

2、原始遞歸運算。我們稱將要定義的函數爲r(x)。原始遞歸的運算包括把某種特定的值賦給r(0),和一個由已經得到的r(k)來確定r(k+1)的過程(圖2)。

clip_image013

圖2 原始遞歸的運算——r(x)的計算

3、極小化運算。對於每一個給定的全函數clip_image015 引進一個新函數clip_image017 ,對於給定的clip_image019 ,新函數的值爲使得clip_image021 的最小的y。記作clip_image023 ,這樣的y值可能沒有定義(圖3)。

clip_image025

圖3 極小化運算——由f(y,x)計算h(x)

這三個運算能力是強有力的。原始函數通過複合生成基本遞歸函數類,繼而根據原始遞歸運算生成遞歸函數類,再經過極小化運算即可得到部分遞歸函數類。由此可見覆合運算、原始遞歸運算和極小化運算在數學體系中的關鍵作用,這也使得我們推想它們在程序設計中的重要性,它們與程序基層控制機制密切相關。

構造性是計算機系統的最根本特徵,也是能行過程的重要特徵,而遞歸是最具代表性的構造性數學方法。遞歸函數類就是遞歸構造得到的,而程序是構造性證明,圖靈機理論已經蘊含了程序設計的思想。我們用函數方法構造一個可計算函數f(或者等價地構造性證明f是可計算的),就等於對f進行程序設計。Turing-Church論題告訴我們:遞歸函數類等同於能行可計算函數。而複合運算、原始遞歸運算和極小化運算髮揮了很關鍵的作用,所以旨在提供通用計算功能的計算機必須實現這些運算。程序設計語言中的許多設施都是爲了構造遞歸函數類而設置的。過程(Procedure)和宏(Macro)爲運用複合提供了明顯的便利。爲了應付複合和原始遞歸運算的定義,一些程序設計語言,如ALGOL68,還提供了以函數作爲輸入參數和輸出結果的特殊過程。這樣複合運算可以解釋成提供過程的功能。極小化運算實質上包含了對具有檢測出口條件的循環進行程序設計的能力,它使用了結構程序設計中的Do While運算。原始遞歸運算不像極小化運算的功能那樣強,它也包含循環,但在某些情況下,循環次數是預先確定的,這與使用任意檢測在每一步確定終止條件是否滿足的情形正好相反。使用Do While和FOR循環均可實現原始遞歸運算。

結構化程序設計最初由Dijkstra提出,1966年G.Jacopini和C.Bohn從理論上證明了:任何單入口、單出口程序僅使用序列、循環和條件三種結構就可以表示出來。這種程序設計方法採用了反覆運用幾個簡單運算的思想,用這三種結構我們可以很方便完成遞歸函數理論的基本運算(圖4、圖5、圖6),從而可以表達任意計算過程。

clip_image027

圖4 序列運算表達的複合

clip_image029 clip_image031

圖5 使用“Do While”的極小化 圖6 使用“Do while”(定義一個單自變量函數r(x))的原始遞歸

在原始遞歸中如果我們開始就知道執行的次數,則完全可以用for循環來實現。由於全函數經過極小化運算後可能不是全函數,即不存在最小y的解,從而結構程序設計中Do While循環可能出現死循環,這在程序設計中要值得注意。利用結構程序設計語言提供的控制機制,我們可以很容易構造出原始函數和複合、原始遞歸和極小化運算。下面是用C語言函數實現的三個原始函數和三個運算,利用這六個函數可以計算任何可計算函數,完成遞歸理論的運算。可見程序設計的能力和遞歸函數理論表達能力是相同的,函數的構造和程序設計是等價的。

◆ 零函數 ◆原始遞歸運算

int zero(int x) int recursion(int y)

{ {

return(0); int k,h;

} h=f(x1,…,xn);

◆ 後繼函數 while(y<>k)

int successor(int x) {

{ h=g(x1,…,xn,k,h);

return(x+1); k++;

} }

◆ 廣義單位函數 return(h);

int projection(int i,int x1,int x2,…,int xn) }

{ ◆極小化運算

if(i==1)return(x1); int minmalisation()

if(i==2)return(x1); {

… int y,k;

if(i==n)return(xn); y=0;

} k=f(x1,…,xn,y);

◆ 複合運算 while(k<>0)

int composition() {

{ y++;

int y1,y2,…,yk; k=f(x1,…,xn,y);

y1=f1(x1,…,xn); }

y2=f1(x1,…,xn); return(y);

… }

yk=f1(x1,…,xn);

return(g(y1,…,yk));

}

程序設計是計算機實踐的基本活動,而遞歸思想直接影響了程序設計的構造,它決定了程序設計語言的許多關鍵技術,從而遞歸過程、遞歸程序就十分自然了。簡單地說,遞歸過程就是自身調用自身過程,包含遞歸過程的程序我們稱爲遞歸程序。在程序設計中使用遞歸算法往往可以簡化求解問題的複雜性。如著名的梵天塔問題,這個問題只有用遞歸方法解決,而不能用其他方法有效求解。用遞歸過程描述如下:

void Hanoi(int n,char left,char middle,char right)

{

if(n==1)move(1,one,-,three);

else

{

hanoi(n-1,left,right,middle);

move(1,left,-,right);

hanoi(n-1,middle,left,right);

}

}

在編譯技術中遞歸過程使用更爲普遍,處理符號表達式遞歸過程尤爲自然,因爲這樣的程序結構和數據結構相匹配。下面是Pascal語言一個子集TINY語言的文法(圖7),從文法中我們可以看到許多遞歸結構,所以語法分析採用遞歸下降文法進行分析自然就很簡單。我們爲每一文法成分構造一個函數,這些函數之間相互調用,直接或間接就構成了遞歸。

clip_image033

圖7 TINY語言的文法

遞歸程序中的變量與機器中的存儲單元對應,當程序被它本身調用時,它將使用相同的存儲單元改寫它們原先的內容。所以有了棧這樣的數據結構,用來存儲必須保存的寄存器內容。這一存儲在進入子程序前由調用程序完成或在子程序使用前完成。爲了增強遞歸程序設計的效率,現在的計算機體系結構中設有硬件棧數據結構,它由一組寄存器組成,並且用專用的指令push和pop來處理棧操作。由此可見,遞歸思想在計算機系統中是非常普遍的,它甚至影響了計算機的體系結構。

遞歸函數理論作爲計算機科學的元科學,對計算機實踐具有非常重要的意義,而程序設計作爲計算機科學基本的實踐活動,遞歸思想直接影響了程序設計語言的構造,也影響了計算機的體系結構。遞歸是一種普遍的思維機制,這在計算機科學的理論和實踐中得到了很廣泛的應用,對計算機的發展起了至關重要的作用。

 

[參考文獻]
1、(美)F.S.Beckman 程序設計的數學基礎 1991.8 科學出版社
2、(英)J.M.布雷迪 計算機科學理論-程序設計途徑 1988.4 科學出版社
3、董榮勝、古天龍 計算機科學與技術方法論 2002.9 人民郵電出版社

 

http://blog.csdn.net/liuben/article/details/6342903

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章