Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file return如何在递归批处理函数中工作_Batch File_Cmd - Fatal编程技术网

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.
有几件事我不明白:

  • 为什么fibNumberN变量在传递时没有%%并且在回显时被视为字符串
  • ENDLOCALset周围的括号的用途是什么
  • 根据我的理解,NumberN变量应该在ENDLOCAL之后未定义,但它仍然可以使用

我已修改了您的问题,以包括您链接到的代码的原始位置。我这样做是因为它应该更好地向您展示如何正确使用它。@Compo感谢您的澄清,原始源代码确实有一个更好看的代码。但我仍然无法找到问题的答案。如果您有答案,请解释一下带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周期。