看板 EZsoft 關於我們 聯絡資訊
我利用call :label的方式寫了一個河內塔的遞迴函式 第一個版本是ok的 ================第一個版本=========================== @echo off set return= set /p n=請輸入河內塔n的數目: call :sub1 %n% echo 要移動%return%次 pause goto :eof REM //================== REM // 河內塔1 REM //================== :sub1 if "%1"=="1" ( set return=1 goto :eof ) set /a temp=%1-1 call :sub1 %temp% set /a return=1+2*return goto :eof ================================================== 後來改寫河內塔的函式,但是這個好像有延遲變數的問題 在set /a AAA=%1-1 這行得到的AAA是空字串(見紅色的部分) 我想請問為什這裡得到的會是空字串(輸出AAA=)? REM //================== REM // 河內塔2 REM //================== :sub2 if "%1"=="1" ( set return=1 ) ELSE ( set /a AAA=%1-1 echo AAA=%AAA% call :sub2 %AAA% set /a return=1+2*return ) goto :eof 因為二版有遲延變數的問題,所以打開遲延變數 但是這個版本在執行到紅色這行之後, 會出現missing operand的錯誤訊息,return的值會 變成空的,不知道有沒有人可以說明一下這個錯誤 發生的原因。 REM //================== REM // 河內塔3 REM //================== :sub2 setlocal enabledelayedexpansion if "%1"=="1" ( set return=1 ) ELSE ( set /a AAA=%1-1 call :sub2 !AAA! set /a return=1+2*!return! ) endlocal goto :eof -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.130.84
hpo14:echo !AAA! 試看看 08/12 01:34
tsaiminghan:case2中沒有用延遲變數,所以不會認得!AAA! 08/12 02:00
tsaiminghan:case3用了延遲變數,但是return的值沒辦法保住 08/12 02:00
tsaiminghan:我自已試的結果,如果沒開延遲變數的功能 08/12 02:01
tsaiminghan:!AAA!是不會被當成變數的 08/12 02:02