在某些限制下3,允许递归函数调用。递归函数是指直接或间接调用自身的函数。例如,以下是一种计算给定整数阶乘的低效方法4:
function retval = fact (n)
if (n > 0)
retval = n * fact (n-1);
else
retval = 1;
endif
endfunction
这个函数是递归的,因为它直接调用了自身。它最终会终止,因为每次调用自身时,使用的参数都比前一次调用少一。一旦参数不再大于零,它就不再调用自身,递归结束。
函数 max_recursion_depth 可用于指定递归深度的限制,并防止 Octave 无限递归。同样,函数 max_stack_depth 可用于指定函数调用深度的限制,无论是否递归。这些限制有助于防止 Octave 运行所在计算机上的堆栈溢出,从而让解释器抛出错误并返回到命令提示符,而不是带着信号退出。
val = max_recursion_depth () ¶old_val = max_recursion_depth (new_val) ¶old_val = max_recursion_depth (new_val, "local") ¶查询或设置函数递归调用次数的内部限制。
如果超过限制,则会打印一条错误消息,并将控制权返回到顶层。
当从函数内部使用 "local" 选项调用时,该变量会在函数及其调用的任何子函数中局部更改。退出函数时将恢复原始变量值。
另请参阅: max_stack_depth。
val = max_stack_depth () ¶old_val = max_stack_depth (new_val) ¶old_val = max_stack_depth (new_val, "local") ¶查询或设置函数调用深度的内部限制。
如果超过限制,则会打印一条错误消息,并将控制权返回到顶层。
当从函数内部使用 "local" 选项调用时,该变量会在函数及其调用的任何子函数中局部更改。退出函数时将恢复原始变量值。
另请参阅: max_recursion_depth。
Octave 的某些函数是通过无法递归调用的函数实现的。例如,ODE 求解器 lsode 最终是在一个无法递归调用的 Fortran 子程序中实现的,因此 lsode 不应在用户提供给 lsode 的函数中直接或间接地被调用。否则会导致错误。
更好的做法是使用 prod (1:n) 或 gamma (n+1),但首先需确保值 n 确实是一个正整数。
版权所有 © 2024-2026 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2