« メモ:2011年6月8日 (水曜) 朝日新聞朝刊 [天声人語] 中の「ゲーテの言葉」 | トップページ | ドイツ語と英語の初歩。または、私は如何にして心配するのを止めて [メモ:2011年6月8日 (水曜) 朝日新聞朝刊 [天声人語] 中の「ゲーテの言葉」] 補足を書くことになったか »

アッカーマン関数の計算プログラムの実例を示したウェブページ

[アッカーマン関数 (Ackermann function) Ack(4,2) の 19729 桁] (2011年6月3日[金]) に補足して、アッカーマン関数の計算プログラムの実例を列挙したウェブページがあるので紹介しておく。それは [Rosetta Code] と云うサイト内ののウェブページ [Ackermann function] (last modified on 8 June 2011, at 23:01. available under GNU Free Documentation License 1.2.) である。

詳細は原文を参照して頂くことにして、そのうちの幾つかを紹介すると (私はプログラムのことは全く分からないので、引用の仕方が間違えているかもしれない。その場合は悪しからず。。。):

C

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

static uint32_t ackermann(uint32_t m, uint32_t n)
{
return m == 0 ? n + 1 : ackermann(m - 1, n == 0 ? 1 : ackermann(m, n - 1));
}

int main(void)
{
unsigned int m, n;
for (n = 0; n < 7; n++)
       {
       for(m = 0; m <= 4; m++)
	     {
	     (void) fprintf(stdout,"A(%u,%u) = %ju\n", m, n, (uintmax_t) ackermann((uint32_t) m, (uint32_t) n));
	     }
	     (void) fprintf(stdout,"\n");
	     }
	     return EXIT_SUCCESS;
	     }

LISP

(defun ackermann (m n)
  (cond ((zerop m) (1+ n))
	((zerop n) (ackermann (1- m) 1))
	(t         (ackermann (1- m) (ackermann m (1- n))))))

FORTRAN (version 90 以降)

PROGRAM EXAMPLE
IMPLICIT NONE

INTEGER :: i, j

DO i = 0, 3
DO j = 0, 6
WRITE(*, "(I10)", ADVANCE="NO") Ackermann(i, j)
END DO
WRITE(*,*)
END DO

CONTAINS

RECURSIVE FUNCTION Ackermann(m, n) RESULT(ack)
INTEGER :: ack, m, n

IF (m == 0) THEN
ack = n + 1
ELSE IF (n == 0) THEN
ack = Ackermann(m - 1, 1)
ELSE
ack = Ackermann(m - 1, Ackermann(m, n - 1))
END IF
END FUNCTION Ackermann

END PROGRAM EXAMPLE

Java

import java.math.BigInteger;

public static BigInteger ack(BigInteger m, BigInteger n)
{
return m.equals(BigInteger.ZERO) ? n.add(BigInteger.ONE)
: ack(m.subtract(BigInteger.ONE), n.equals(BigInteger.ZERO) ? BigInteger.ONE                                                                                               : ack(m, n.subtract(BigInteger.ONE)));
}

Mathematica (その1)

$RecursionLimit=Infinity
Ackermann1[m_,n_]:=
If[m==0,n+1,
If[ n==0,Ackermann1[m-1,1],
Ackermann1[m-1,Ackermann1[m,n-1]]
]
]

Mathematica (その2)

Ackermann2[0,n_]:=n+1;
Ackermann2[m_,0]:=Ackermann1[m-1,1];
Ackermann2[m_,n_]:=Ackermann1[m-1,Ackermann1[m,n-1]]

変数の範囲を初めから制限している例が見られるのが、興味深いと言えば興味深いし、当然だと言えば当然だろう。

|
|

« メモ:2011年6月8日 (水曜) 朝日新聞朝刊 [天声人語] 中の「ゲーテの言葉」 | トップページ | ドイツ語と英語の初歩。または、私は如何にして心配するのを止めて [メモ:2011年6月8日 (水曜) 朝日新聞朝刊 [天声人語] 中の「ゲーテの言葉」] 補足を書くことになったか »

ネット/ソフト/サイト」カテゴリの記事

大きなお世話」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/40172/51941319

この記事へのトラックバック一覧です: アッカーマン関数の計算プログラムの実例を示したウェブページ:

« メモ:2011年6月8日 (水曜) 朝日新聞朝刊 [天声人語] 中の「ゲーテの言葉」 | トップページ | ドイツ語と英語の初歩。または、私は如何にして心配するのを止めて [メモ:2011年6月8日 (水曜) 朝日新聞朝刊 [天声人語] 中の「ゲーテの言葉」] 補足を書くことになったか »