logo

logo

メールマガジン・新着情報一覧

  1. TOP
  2. メールマガジン・新着情報一覧
  3. A-0083. PythonとLispで再帰的プログラム — TT

2018.07.11

A-0083. PythonとLispで再帰的プログラム — TT

◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇

PythonとLispで再帰的プログラム

発行:エスオーエル株式会社
https://www.sol-j.co.jp/

連載「X線CTで高精度寸法測定!?」
2018年7月11日号 VOL.083

平素は格別のお引き立てを賜り、厚く御礼申し上げます。
X線CTスキャンによる精密測定やアプリケーション開発情報などをテーマに、
無料にてメールマガジンを配信いたしております。

◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇



普段私は、コンピュータに計算やデータ処理をやらせるとき、
(エクセルはよく使いますが) C++ を使うことが多いです。

使い慣れているので、他の言語をかじっても、
結局 C++ に戻ってきます。

しかし今、Python にハマりつつあります。

打ち込む文字数が少なくて済み、コンパイルもせずに、
欲しい結果がすぐ得られます。
しかも、思った以上に、何でもできます。

特に、先人たちのノウハウの蓄積であるライブラリが優れていて、
簡単に「巨人の肩の上」に立つことができます。
NumPy、SciPy、PuLP などといったライブラリを読み込めば、
複雑な計算プログラムも手早く作ることができます。
GUIライブラリもあります。
さらには、Deep Learning のライブラリも充実しているので、
飽きずに遊べます。

統計処理に以前は R言語 を使用していましたが、
もはや Python に乗り換える気満々です。

C++ ユーザーは、C++ こそが万能で最速と思っている節があると思いますが、
Python を使えば使うほど、
Python が最近もてはやされている理由が分かります。


何か新しいプログラミング言語を学ぶとき、
普通は「Hello World.」と出力するプログラムを
最初に作ってみます。

でも、それだけではつまらないので、
最初は何か単純だけれどもつまらなくない計算させてみます。

そのとき、再帰的プログラムが良い練習になります。

再帰的プログラムとは、
プログラム内で関数を定義するときに、
その関数自身を定義に含める手法です。

Python による再帰的プログラムの例として、
階乗を計算するプログラムを書いてみます。

x = int(input())
def factorial(x):
    if x <= 1:
        return 1
    else:
        return x * factorial(x-1)
print(factorial(x))

これは、1行目で数値入力を求め、入力された数値を x に収納します。
2行目から factorial(x) という関数を定義しています。
3行目で、x が 1 以下だったときの条件として、
4行目のように factorial(x) は 1 を返す関数だと決めています。
5行目で、x が 1 以下ではなかったときの条件として、
6行目のように factorial(x) は x と factorial(x-1) の積を
返す関数だと決めています。
つまり、factorial(x) を定義している 6行目に factorial(x) という
関数が必要になります。これが再帰的定義です。
7行目は、結果の出力です。

このプログラムは、1からxまでの整数を全て順番に掛け算した数値を
結果出力します。

実行してみて、数値 10 を入力すると、
3628800 という答えが返ってきます。

数値に 100 を入力すると、長い数字が返ってきます。
でも、1000 を入力すると、エラーになってしまいました。
再帰の回数が限界を超えてしまったようです。
998までなら、計算できることが分かりました。


さて、人工知能で有名な Python ですが、Python を使っていると、
自分の中の Lisp という言語を触った記憶がうずきます。

そして、久方ぶりに Lisp もインストールしてしまいました。
これにより、Python でプログラムを書くたびに、
Lisp で書いたらどうなるかなと考えてしまうはめになり、二度手間です。

Lisp は、プログラムがプログラムを書くということができるなど、
昔から人工知能の分野では有名な言語です。
Lisper と呼ばれるマニアが存在することでも知られており、
その魔力に魅かれる気持ちは分からなくもないです。
(事実、Lispをインストールさせられ、Python の学習時間を奪っている。)

Lisp で階乗を計算する再帰的プログラムを書くと、

(defun factorial(x)
    (if (<= x 1) 1
    (* x (factorial(- x 1)))))

となります。たった3行、素晴らしい。

実行するときは、

(factorial 10)

と打ち込むことで、3628800 という答えが返ってきます。
さらに、

(factorial 100)
(factorial 1000)
(factorial 10000)

どれも答えが返ってきます。
画面が数字で埋め尽くされますが。

(factorial 65000) まで、答えが返ってきました。

(factorial 66000) では、答えが出てきませんでした。


--
高野智暢 

一覧に戻る

お問い合わせ Contact

048-441-1133

お問合せフォーム