8.2.2递归

有一些限制3,允许递归函数调用。A.递归函数是一个直接或直接自称的人。例如,这里有一个低效的4计算给定整数的阶乘的方法:

函数retval=fact(n)如果(n>0)retval=n*fact(n-1);否则retval=1;endifend函数

这个函数是递归的,因为它直接调用自己。它最终会终止,因为每次它调用自己时,都会使用比上次调用少一个的参数。一旦自变量不再大于零,它就不会调用自己,递归就结束了。

函数最大诅咒深度可以用于指定递归深度的限制,并防止Octave波无限递归。同样,函数最大背包深度可以用于指定函数调用的深度限制,无论是否递归。这些限制有助于防止Octave运行的计算机上的堆栈溢出,因此解释器将抛出一个错误并返回命令提示符,而不是带着信号退出。

 
: val = max_recursion_depth ()
: old_val = max_recursion_depth (new_val)
: old_val = max_recursion_depth (new_val, "local")

查询或设置函数递归调用次数的内部限制。

如果超过限制,则会打印一条错误消息,控制返回到最高级别。

当从具有的函数内部调用时地方的参数,则该变量会为函数及其调用的任何子程序在本地进行更改。退出函数时将恢复原始变量值。

详见: 最大背包深度.

 
: val = max_stack_depth ()
: old_val = max_stack_depth (new_val)
: old_val = max_stack_depth (new_val, "local")

查询或设置函数递归调用次数的内部限制。

如果超过限制,则会打印一条错误消息,控制返回到最高级别。

当从具有的函数内部调用时地方的参数,则该变量会为函数及其调用的任何子程序在本地进行更改。退出函数时将恢复原始变量值。

详见: 最大诅咒深度.


脚注

3.

Octave的一些函数是用不能递归调用的函数来实现的。例如,ODE解算器lsode最终在不能递归调用的Fortran子程序中实现,因此lsode不应从用户提供的函数中直接或间接调用lsode要求。这样做会导致错误。

4.

它会更好地使用戳(1:n)伽玛(n+1)相反,在第一次检查以确保值n实际上是一个正整数。


版权所有 © 2024 Octave中文网

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