バッチファイルでProject Euler(6)

再帰

変数がローカルでなかったり、gotoが使われているのが気に入らない場合は、やっぱり再帰でしょうね。よくある階乗の例を見てみましょう。

@echo off

call :factorial %1
echo %ERRORLEVEL%
exit /b 0

:factorial
    setlocal
    if %1 == 0 exit /b 1
    set /a i = %1 - 1
    call :factorial %i%
    set /a n = %1 * %ERRORLEVEL%
    exit /b %n%
>factorial.bat 10
3628800

factorialからfactorialを呼び出しています。簡単ですね。これでこの問題についても簡単に書けます。

@echo off

set /a N = 1000
set /a M = N - 1
set /a s = 0
for /L %%i in (1, 1, %M%) do call :sum %%i
echo %s%
exit /b 0

:sum
    setlocal
    call :is_valid %1
    if %ERRORLEVEL% == 1 set /a s += %1
    exit /b 0

:is_valid
    setlocal
    set /a r3 = %1 %% 3
    if %r3% == 0 exit /b 1
    set /a r5 = %1 %% 5
    if %r5% == 0 exit /b 1
    exit /b 0

環境にもよるでしょうが、1000くらいの深さなら大丈夫のようです。