« 再帰呼び出し:Recursive call | トップページ | 湿度 »

2012年2月13日 (月)

まだやってる

●日付は飛びましたが、この話は前回の続き。(今回の続きはまたあとで。)
{昔、大橋巨泉さんと前田武彦さんのトーク番組がラジオ関東という局でありまして、「今日の話は昨日の続き、今日の続きはまた明日」というんですね。それをもじりました。}

★階乗を計算するなら、ループの方が速いです。
再帰を使うのは面白いけど「愚」です。
下がそのプログラムですが、使ってる変数は fac 一つですもの。
再帰呼び出しをすると、レベルごとに変数や状態を退避させて保存し、帰りがけにまた状態を復帰させて、ということで、恐ろしくメモリーを食うんです。(「スタックに積む」というのですが、再帰を深くし過ぎると、スタック・オーバーフローというエラーを起こします。)
今のパソコンではあまり心配しなくてもいいですけど、やはり速度的に再帰の方が劣ります。
コンパイラの中には賢いコンパイラもあって、再帰で書かれたプログラムを、コンパイル時にループに書き直しているのもあるようですね。
------------------------------
LET MAX = 10

FOR i = 0 TO MAX
   LET fac = 1
   FOR j = i TO 1 STEP -1   
      LET fac = fac * j
   NEXT j
   PRINT fac
NEXT i

END
------------------------------
1
1
2
6
24
120
720
5040
40320
362880
3628800
------------------------------

★フィボナッチ数列もループで書けて、その方が速いです。
定義通りに、初項と第2項を「1」と書いてしまいます。
項 f に対して、その直前の項をbとし、二つ前の項をaとします。
f=b+a
ですね。
f が求まったら、bをaに移し、fをbに移して、次の項を求めに進めばよいわけです。
------------------------------
LET a = 1
LET b = 1
PRINT a
PRINT b

LET f = 0
FOR i = 1 TO 20
   LET f = b + a
   PRINT f
   LET a = b
   LET b = f
NEXT i
END
------------------------------
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
------------------------------
冬の写真ネタの少ない時期、プログラムで遊んでいると楽しくっていいです。

« 再帰呼び出し:Recursive call | トップページ | 湿度 »

理科おじさん」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: まだやってる:

« 再帰呼び出し:Recursive call | トップページ | 湿度 »

2024年5月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
サイト内検索
ココログ最強検索 by 暴想
無料ブログはココログ