@echo off
setlocal
set s_=0
set i_=0
set /a "i=1<<12"
for /l %%i in (1,1,%i%) do call :collatz %%i
echo f(%i_%) = %s_%
endlocal
goto :EOF
:collatz
set n=%1
set s=0
:loop
if %n% leq 1 goto compare
set /a m=%n%%%2
if %m% equ 0 (set /a n/=2) else (set /a n=3*%n%+1)
set /a s+=1
goto loop
:compare
if %s% leq %s_% goto :EOF
set s_=%s%
set i_=%1
goto :EOF
silverwire
#5670()
[
Batchfile
]
Rating0/0=0.00
バッチで書いてみました。 速度に難があるため、1 ~ 2^12までの範囲でしか確認できていませんが、一応投稿します。 実行時間の計測には「実行時間の測定」で投稿したものを使用しています。 e.g. 実行環境 : Pentium M (1.6GHz), 768MB RAM 実行結果 : f(3711) = 237 実行時間 : 450050 (ms) 最初は以下のようにcallを使用して再帰的に書いていたのですが、速度を考慮してgotoを 利用したループに書き換えました。 e.g. :collatz if %1 leq 1 goto :EOF set /a m=%1%%2 if %m% equ 0 (set /a n=%1/2) else (set /a n=3*%1+1) call :collatz %n% goto :EOF ただそれでも2^20まで実行した場合 1日では終わらないので、全く異なるロジックを編み 出す以外、手詰まりとなってしまいました。 # おそらく、遅延環境変数展開を利用して書き換えたくらいでは焼け石に水でしょう。@echo off setlocal set s_=0 set i_=0 set /a "i=1<<12" for /l %%i in (1,1,%i%) do call :collatz %%i echo f(%i_%) = %s_% endlocal goto :EOF :collatz set n=%1 set s=0 :loop if %n% leq 1 goto compare set /a m=%n%%%2 if %m% equ 0 (set /a n/=2) else (set /a n=3*%n%+1) set /a s+=1 goto loop :compare if %s% leq %s_% goto :EOF set s_=%s% set i_=%1 goto :EOFRating0/0=0.00-0+
[ reply ]