Что не так с этим рекурсивным сценарием Windows CMD? Это не сделает Акерманна должным образом - PullRequest
1 голос
/ 21 апреля 2010

Я пытаюсь вычислить функцию Аккермана. Описание того, чего я пытаюсь достичь, это http://rosettacode.org/wiki/Ackermann_function.

Используя тестовый скрипт, Test 0 4 дает мне 5, что правильно. Однако тест 1 4 дает 5, а не 6, а тест 2 4 дает 5 вместо 11.

Куда я иду не так?

::echo off
set depth=0
:ack
if %1==0 goto m0
if %2==0 goto n0

:else
set /a n=%2-1
set /a depth+=1
call :ack %1 %n%
set t=%errorlevel%
set /a depth-=1
set /a m=%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/a n=%2+1
if %depth%==0 ( exit %n% ) else ( exit /b %n% )

:n0
set /a m=%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% )

Я использую этот скрипт для проверки

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

Пример вывода для теста 1 1 дает:

>test 1 1
>set depth=0
>if 1 == 0 goto m0
>if 1 == 0 goto n0
>set /a n=1-1
>set /a depth+=1
>call :ack 1 0
>if 1 == 0 goto m0
>if 0 == 0 goto n0
>set /a m=1-1
>set /a depth+=1
>call :ack 0 0
>if 0 == 0 goto m0
>set/a n=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 /a m=1-1
>set /a depth+=1
>call :ack 0 1
>if 0 == 0 goto m0
>set/a n=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

Ответы [ 2 ]

2 голосов
/ 21 апреля 2010

Изменить строку 27 выше с

call :ack %m% %2 

до

call :ack %m% 1
0 голосов
/ 21 апреля 2010

Каков охват ваших переменных m и n?

Вы устанавливаете значения в течение одного вызова: ack, а затем рекурсивно вызываете снова, устанавливая значения. Вы их перезаписываете? В основанных на стеке языках, таких как C и Java, локальные переменные хороши, каждый уровень рекурсии получает новые переменные. Что происходит в cmd?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...