【问题标题】:Batch script factorial recursive批处理脚本阶乘递归
【发布时间】:2022-07-02 15:35:00
【问题描述】:
    @echo off
setlocal enableDelayedExpansion
:: Fiche 3 Exercice 6
Title Fiche 3 Exercice 6
color B4
Mode con cols=100 lines=40

echo CALCULATRICE FACTORIELLE
set /p nbToCalc=Entre le nombre : 
set /a fact=1
call :CalcFact %nbToCalc%

:finfact
echo.
pause
exit

:CalcFact
if !nbToCalc! gtr 0 (
    set /a fact= !nbToCalc! * %fact%(!nbToCalc! - 1)
    goto :CalcFact
) else (
    goto :finfact
)

状态 1: 编写一个脚本来计算并显示一个数字的阶乘。 该脚本将调用一个递归函数。 该数字在脚本启动时作为参数传递。 该函数将返回传入参数的数字的阶乘。
见以下链接:https://fr.wikipedia.org/wiki/Factorielle

备注: 当在重复指令块中访问变量时 用'!并不是 '%'。在程序的开头添加: setlocal enableDelayedExpansion1

【问题讨论】:

  • 你说的“写一个脚本”,你确定一定是批处理文件吗?为什么不使用 Powershell?或者任何 UNIX 脚本?
  • 我看不到关于你的作业的任何问题?
  • 与您的最后一个问题一样,这项任务完全没有意义。我之所以这么说是因为Set /A 只能处理 32 位整数。这意味着通过Call 命令传递给您的标签的整数不能大于1213 的阶乘为 6227020800,大于最大值 2147483647。因此没有理由不使用简单的If 命令结构,本质上是一个表if %~1 equ 12 exit /b 479001600,然后你可以echo %errorlevel%

标签: batch-file


【解决方案1】:

您的代码不是递归的 - 它只是调用一个循环。递归意味着被调用的函数调用自身(而不是跳转到它的开头):

@echo off
setlocal
set fact=1
set /p num=Enter number:

call :fact %num%
echo %errorlevel%
goto :eof

:fact
set /a fact*=num , num-=1
if %num% gtr 0 call :fact
exit /b %fact%

请记住,由于set /p 的 32 位限制,它仅适用于小于 13 (1..12) 的数字。更大的数字会给出错误的结果。也许您想检查用户输入的有效范围。

(只是一个忠告:你的老师肯定知道如何用谷歌搜索,所以把你所有的作业都扔在这里可能不是最明智的主意。)

注意:call 在堆栈中记住它的“返回地址”。此堆栈是有限的,超出堆栈会导致严重(脚本中断)错误。 (在这种情况下不是问题,因为阶乘迅速升级并首先达到 32 位限制)

【讨论】:

  • 谢谢斯蒂芬,这不是作业,只是我们需要学习通过考试的一些练习。别担心
猜你喜欢
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 2015-04-19
  • 2019-08-06
  • 2019-07-24
  • 1970-01-01
相关资源
最近更新 更多