Batch file return如何在递归批处理函数中工作
所以,我有,那有递归(这是一个剽窃的版本)。为了自己的理解,我做了一点修改Batch file return如何在递归批处理函数中工作,batch-file,cmd,Batch File,Cmd,所以,我有,那有递归(这是一个剽窃的版本)。为了自己的理解,我做了一点修改 @echo off set /A fst=0 set /A fib=1 set /A limit=1000 call :myFibo fib, %fst%, %limit% echo The next Fibonacci number greater or equal %limit% is %fib%. exit /B 0 :myFibo SETLOCAL echo begin of funct %1, %2,
@echo off
set /A fst=0
set /A fib=1
set /A limit=1000
call :myFibo fib, %fst%, %limit%
echo The next Fibonacci number greater or equal %limit% is %fib%.
exit /B 0
:myFibo
SETLOCAL
echo begin of funct %1, %2, %3
set /A Number1=%2
set /A Number2=%1
set /A Limit=%3
set /A NumberN=Number1+Number2
REM
if %NumberN% LSS %Limit% call:myFibo NumberN, %Number2%, %Limit%
(
ENDLOCAL
set %1=%NumberN%
)
exit /B 0
这将产生以下输出:
begin of funct fib, 0, 1000
begin of funct NumberN, 1, 1000
begin of funct NumberN, 1, 1000
begin of funct NumberN, 2, 1000
begin of funct NumberN, 3, 1000
begin of funct NumberN, 5, 1000
begin of funct NumberN, 8, 1000
begin of funct NumberN, 13, 1000
begin of funct NumberN, 21, 1000
begin of funct NumberN, 34, 1000
begin of funct NumberN, 55, 1000
begin of funct NumberN, 89, 1000
begin of funct NumberN, 144, 1000
begin of funct NumberN, 233, 1000
begin of funct NumberN, 377, 1000
begin of funct NumberN, 610, 1000
The next Fibonacci number greater or equal 1000 is 1597.
有几件事我不明白:
- 为什么fib和NumberN变量在传递时没有%%并且在回显时被视为字符串
- ENDLOCAL和set周围的括号的用途是什么
- 根据我的理解,NumberN变量应该在ENDLOCAL之后未定义,但它仍然可以使用
cmd.exe
解析包含ENDLOCAL
的行,该行删除自上一个SETLOCAL
命令以来创建的任何变量或值。当有一个括号内的命令块时,它会解析整个块,其中包括一个变量(使用现在正确的%
括起来),并在结束前存储它。为了更好地了解cmd.exe如何解析脚本,请阅读(由一些负责我链接的原始代码的人创建的)的优秀答案。可以在Windows命令处理器上看到,它解析整个命令块,从(
开始,以匹配的结束)
并在执行命令endlocal
之前将set%1=%NumberN%
替换为,例如,set NumberN=13
或set fib=13
,以恢复控制台窗口中显示的上一个执行环境和下一个命令set
。有关SETLOCAL和ENDLOCAL命令的详细信息,请阅读。也可以使用我在上的回答中描述的ENDLOCAL&set%1=%NumberN%
。此外,我建议不要仅仅为了定义一个带数字的环境变量而使用set/A
(算术表达式),请参见使用类似set/A fib=1
的算术表达式而不是set fib=1
或set“fib=1”
只是浪费CPU周期。