Erlang寫九九乘法表

真是越來越退步,這時候還要寫九九乘法表。不過,是用for迴圈格式來寫的。

-module(loop).
-export([multiple/0]).

for(I, Fe, Fi, Fc) ->
    case Fe(I) of
	true ->
	    Fc(I),
	    I1 = Fi(I),
	    for(I1, Fe, Fi, Fc);
	false ->
	    ok
    end.

fe(I) ->
    I =< 9.

fi(I) ->
    I+1.

fc(I) ->
    for(1, fun fe/1, fun fi/1, fc1(I)).

fc1(I) ->
    fun(J) ->
	    io:format("~w x ~w = ~w~n", [I,J,I*J])
    end.

multiple() ->
    for(2, fun fe/1, fun fi/1, fun fc/1).

迴圈最重要的是四個元素:進入狀態、退出條件、迴圈變數、以及內容。for/4將四個元素定義為四個參數。假設迴圈只靠一個索引值,進入狀態放一個索引值就好。退出條件、迴圈變數和內容,可以自己定義函數並套用,在這個例子中,將三個函數定義為fe/1、fi/1、fc/1。

九九乘法表是二個迴圈,第一個迴圈引導出第二個迴圈內容。所以fc/1內容也是迴圈,迴圈的內容另外定義為fc1/1。二個迴圈的索引值有點不一樣。而二個迴圈的結束條件及變數變動皆相同,為fe/1和fi/1。至於迴圈內容,fc/1的I值必須帶到fc1/1運用,所以用了fc1/1函數解出另一個函數的技巧。

我在想,從這個例子的for迴圈架構,把架構擴充,為了忠實對應到普通的imperative programming,則較內層的函數都要知道外層存在的變數。看樣子應該是要帶一個叫做Domain的參數,將全域變數都收集起來。

廣告

About 黃耀賢 (Yau-Hsien Huang)

熱愛 Erlang ,並且有相關工作經驗。喜歡程式語言。喜歡邏輯。目前用 Python 工作。
本篇發表於 Erlang, Fun。將永久鏈結加入書籤。

3 Responses to Erlang寫九九乘法表

  1. Vincent 說道:

    Your codes is not Erlanglish. How about this one.

    module(nn).
    export([nn/0]).

    nn() ->
    nn(9, 9).

    nn(0, _B) ->
    ok.

    nn(A, 0) ->
    nn(A – 1, 9).

    nn(A, B) ->
    io:format(“~w x ~w = ~w~n", [A,B,A*B])
    nn(A, B – 1).

    • 黃耀賢 (Yau-Hsien Huang) 說道:

      對,的確並非 Erlang 方式的九九乘法表。我以往習慣對同一則題目做多方面的討論(例如排序,同樣用 Prolog 或 Erlang 寫,寫了很多次)。這一篇的主題是專門以 C-ish 方式,用 Erlang 寫九九乘法表。

    • 黃耀賢 (Yau-Hsien Huang) 說道:

      我目前隨便寫九九乘法表,大概都這樣寫:
      T99() ->
      P = fun(N, M) -> io_lib:format(“~B x ~B = ~2B", [N, M, N*M]) end,
      N9 = [_|N8] = lists:seq(1, 9),
      P89 = lists:map(fun(X) -> lists:map(fun(Y) -> {X, Y} end, N9) end, N8),
      lists:map(fun(L) -> lists:map(fun(S) -> io:format(“~s~n", [S]) end, L) end, P89).

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s