ari's world

あるかどうかわからないけど、あるみたい。ありがとう。

再帰で Collaz 予想・Windows 版

昨日のものに大切なことを忘れていました!やっぱり Lightweight Language 使いは再帰がいいじゃん(独断と偏見)ということで、とっくに終わっている 「キミならどう書く 2.0 - ROUND 2 -」の Collaz 予想再帰を使ったバージョンでさっくりと。
再帰を使ったらコードもすっきり。思わぬ効果として、速度も大幅に向上です!

g.cmd


@echo off
set /A g = %2 + 1

if %1 equ 1 (
set /A f = %1
goto finish_point
)

set /A mod_even = %1 %% 2

if %mod_even% EQU 0 (
set /A f = %1/2
) else (
set /A f = 3*%1 + 1
)
set mod_even=

rem ここで再帰
call %0 %f% %g%

:finish_point

collatz_graph.cmd


@echo off
setlocal

set count=%1

call "%~dp0g.cmd" %count% 0
echo %count% %g%

set /A count = %count% - 1
if %count% neq 0 (
rem これも再帰。ちなみに %0 は自分自身をあらわします。
call %0 %count%
)

これで goto もなくなってすっきり。

実行と結果


C:\home\masanari\collaz2>collatz_graph.cmd 100 > collaz_graph.txt

C:\home\masanari\collaz2>graph.cmd collaz_graph.txt
100 :************* [26]
99 :************* [26]
98 :************* [26]
97 :*********************************************************** [119]
96 :****** [13]
95 :***************************************************** [106]
94 :***************************************************** [106]
93 :********* [18]
92 :********* [18]
91 :********************************************** [93]
90 :********* [18]
89 :*************** [31]
88 :********* [18]
87 :*************** [31]
86 :*************** [31]
85 :***** [10]
84 :***** [10]
83 :******************************************************* [111]
82 :******************************************************* [111]
81 :*********** [23]
80 :***** [10]
79 :****************** [36]
78 :****************** [36]
77 :*********** [23]
76 :*********** [23]
75 :******* [15]
74 :*********** [23]
73 :********************************************************** [116]
72 :*********** [23]
71 :*************************************************** [103]
70 :******* [15]
69 :******* [15]
68 :******* [15]
67 :************** [28]
66 :************** [28]
65 :************** [28]
64 :*** [7]
63 :****************************************************** [108]
62 :****************************************************** [108]
61 :********** [20]
60 :********** [20]
59 :**************** [33]
58 :********** [20]
57 :**************** [33]
56 :********** [20]
55 :******************************************************** [113]
54 :******************************************************** [113]
53 :****** [12]
52 :****** [12]
51 :************ [25]
50 :************ [25]
49 :************ [25]
48 :****** [12]
47 :**************************************************** [105]
46 :******** [17]
45 :******** [17]
44 :******** [17]
43 :*************** [30]
42 :**** [9]
41 :******************************************************* [110]
40 :**** [9]
39 :***************** [35]
38 :*********** [22]
37 :*********** [22]
36 :*********** [22]
35 :******* [14]
34 :******* [14]
33 :************* [27]
32 :*** [6]
31 :***************************************************** [107]
30 :********* [19]
29 :********* [19]
28 :********* [19]
27 :******************************************************** [112]
26 :***** [11]
25 :************ [24]
24 :***** [11]
23 :******** [16]
22 :******** [16]
21 :**** [8]
20 :**** [8]
19 :********** [21]
18 :********** [21]
17 :****** [13]
16 :** [5]
15 :********* [18]
14 :********* [18]
13 :***** [10]
12 :***** [10]
11 :******* [15]
10 :*** [7]
9 :********** [20]
8 :** [4]
7 :******** [17]
6 :**** [9]
5 :*** [6]
4 :* [3]
3 :**** [8]
2 :* [2]
1 : [1]

なんか再帰バージョンのほうがぜんぜん速い。アスタリスクのグラフも再帰を使って使いなおすかな。再帰の書き方は The Little Schemer (The MIT Press) を参考にしてます。ってどこにそのエッセンスを感じていただけるかは微妙かもしれませんけれど。