遞迴只應天上有,人間該當用迴圈

遞迴是程式設計師的最愛也最恨,愛的是簡潔,恨的是出包往往在無形之間(Stack Overflow),以及效率非常緩慢。所有的遞迴寫法一定可以用迴圈取代,但換來的就是一連串冗長的程式碼了。

L. Peter Deutsch程式設計師說過一段經典名句「To iterate is human, to recurse, divine.」,他對資訊界最主要的貢獻是Ghostscript和Archie,沒有了這兩個,PDF、雷射印表機PostScript跟早期網路檔案搜尋等功能,就不會出現在我們的生活中了。

這句話中文有人翻做「迭代(iterate)者為人,遞迴(recurse)者為神。」,亦有人譯做「遞迴(recurse)只應天上有,凡人該當用迴圈(iterate)」。很明顯的,最後那一句翻譯更佳貼切與優美,也很明顯的他就是繼承自杜甫的七言絕句「贈花卿」。

贈花卿
------
錦城絲管日紛紛  半入江風半入雲
此曲只應天上有  人間能得幾回聞

在套用上,我覺得天上跟人間是對仗的型態,因此譯做「遞迴只應天上有,人間該當用迴圈」才是最洽當的翻譯。以下是一個用C#簡單寫出來的階乘計算機,在輸入大整數(例如:16)時很容易就溢位了。

class Program
{
  static void Main(string[] args)
  {
    Console.Write("請輸入階層數:");
    Console.Write(factorial(Convert.ToInt32(Console.ReadLine())));
    Console.Read();
  }

  static int factorial(int n)
  {
    if (n == 1) { return 1; }
    return n * factorial(n - 1);
  }
}
Iterate Recurse Translate