文章目錄
- process 與 procedure 在本書中的區別
- 線性遞迴
本人愚笨,被譯書中“計算過程”與“過程”弄暈了都毫不知情。process 在譯書中被譯為:“計算過程”;procedure被譯為:“過程”。而 process 有時又譯為“過程”。
process 與 procedure 在本書中的區別
process 是程式在電腦中的處理過程。見譯書的第1頁第1段第1行:“計算過程(computational process)是存在於電腦裡的一種抽象,在其演化發展中,這些過程(process)會去操作另外被稱為資料(data)的抽象事物。”。
procedure 是對 process 用程式設計語言來進行描述,也就是程式的源碼。見譯書第3頁第1行:“計算過程的Lisp描述,稱為過程(procedures)”。
弄清兩者的區別後,繼續閱讀 1.2 節的遞迴 process 與遞迴 procedure。
p.s. TopLanguage群組中有高手在談 programming 翻譯為“編程”?“程式設計(program design)”?一樣有意思。有爭論就有進步嘛。
線性遞迴
線性遞迴與樹形遞迴相區別,不同點可以看累加、階乘執行個體。關於“遞迴”的知識,下面引用Dexter.Yy的《遞迴與遞推:JavaScript在斐波那契數的尾遞迴方法》中的:
在程式執行的過程中,“遞迴”(recursive)指的是一種方法,把大的複雜的問題分解成更小更簡單的問題,逐級分解下去,直到問題的規模小到可以直接求解,然後再逐級向上回溯直到解決最初的問題。遞迴的計算過程(recursive process)包含了兩個階段,先逐級擴充(expansion),構造起一個由被延遲的操作組成的鏈條(會被解譯器儲存在堆棧裡),然後在收縮(contraction)階段逐級回溯執行那些操作。
Ackermann(阿克曼)函數是以德國數字家阿克曼命名的函數,它是線性遞迴中線性增長較快的一種。在網上有習題 1.10 的答案
下面是用JavaScript改寫的程式實現:
function A(x,y){ if(y==0) { return 0; } if(x==0) { return 2*y; } if(y==1) { return 2; } else{ return arguments.callee(x-1,arguments.callee(x,y-1)); }}
用C#語言的程式實現:
using System;class TestCase{ static int A(int x, int y) { int sum = 0; if(y==0) { return sum; } if(x==0) { sum = 2*y; return sum; } if(y==1) { sum = 2; return sum; } else { sum = A(x-1, A(x, y-1)); return sum; } } static void Main() { Console.Write(A(1, 10)); }}