这个recursion的Windows CMD脚本有什么问题? 它不会正确地做阿克曼

我试图去计算阿克曼函数。 我想要实现的描述是http://rosettacode.org/wiki/Ackermann_function 。

使用testing脚本,testing0 4给我5哪个是正确的。 然而testing1 4给出5而不是6,而testing2 4给出5而不是11。

我哪里错了?

::echo off set depth=0 :ack if %1==0 goto m0 if %2==0 goto n0 :else set /an=%2-1 set /a depth+=1 call :ack %1 %n% set t=%errorlevel% set /a depth-=1 set /am=%1-1 set /a depth+=1 call :ack %m% %t% set t=%errorlevel% set /a depth-=1 if %depth%==0 ( exit %t% ) else ( exit /b %t% ) :m0 set/an=%2+1 if %depth%==0 ( exit %n% ) else ( exit /b %n% ) :n0 set /am=%1-1 set /a depth+=1 call :ack %m% %2 set t=%errorlevel% set /a depth-=1 if %depth%==0 ( exit %t% ) else ( exit /b %t% ) 

我用这个脚本来testing它

 @echo off cmd/c ackermann.cmd %1 %2 echo Ackermann of %1 %2 is %errorlevel% 

对于testing11,样本输出给出:

 >test 1 1 >set depth=0 >if 1 == 0 goto m0 >if 1 == 0 goto n0 >set /an=1-1 >set /a depth+=1 >call :ack 1 0 >if 1 == 0 goto m0 >if 0 == 0 goto n0 >set /am=1-1 >set /a depth+=1 >call :ack 0 0 >if 0 == 0 goto m0 >set/an=0+1 >if 2 == 0 (exit 1 ) else (exit /b 1 ) >set t=1 >set /a depth-=1 >if 1 == 0 (exit 1 ) else (exit /b 1 ) >set t=1 >set /a depth-=1 >set /am=1-1 >set /a depth+=1 >call :ack 0 1 >if 0 == 0 goto m0 >set/an=1+1 >if 1 == 0 (exit 2 ) else (exit /b 2 ) >set t=2 >set /a depth-=1 >if 0 == 0 (exit 2 ) else (exit /b 2 ) Ackermann of 1 1 is 2 

从上面的第27行改变

 call :ack %m% %2 

 call :ack %m% 1 

你的变量m和n的范围是什么?

您可以在一次调用中将值设置为:ack,然后再次递归调用设置值。 你覆盖他们吗? 在基于Stack的语言中,比如C和Java,局部变量都很好,每个递归级别都有新的变量。 在cmd中会发生什么?