まだやってる
●日付は飛びましたが、この話は前回の続き。(今回の続きはまたあとで。)
{昔、大橋巨泉さんと前田武彦さんのトーク番組がラジオ関東という局でありまして、「今日の話は昨日の続き、今日の続きはまた明日」というんですね。それをもじりました。}
★階乗を計算するなら、ループの方が速いです。
再帰を使うのは面白いけど「愚」です。
下がそのプログラムですが、使ってる変数は 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 | トップページ | 湿度 »
「理科おじさん」カテゴリの記事
- 化学の日(2022.10.26)
- 秒速→時速(2022.09.01)
- 風速75メートル(2022.08.31)
- 「ウクライナで生まれた科学者たち」(2022.05.31)
- 反射光(2022.05.09)
この記事へのコメントは終了しました。
コメント