8.2.2 递归

在某些限制下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


脚注

(3)

Octave 的某些函数是通过无法递归调用的函数实现的。例如,ODE 求解器 lsode 最终是在一个无法递归调用的 Fortran 子程序中实现的,因此 lsode 不应在用户提供给 lsode 的函数中直接或间接地被调用。否则会导致错误。

(4)

更好的做法是使用 prod (1:n)gamma (n+1),但首先需确保值 n 确实是一个正整数。


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2