我很难找到递归的工作原理。一些教科书说“递归是指一个函数一次又一次地调用自己,直到满足某些基本条件”。
有些书说“递归是指一个函数一次又一次地调用另一个函数,直到满足某些基本条件”。
哪个是真的?如果两者都是真的,我们可以将下面给出的示例视为递归吗?如果不是,那么在性能方面哪个更好,
下面的代码或递归?
def Function1()
{
/* do something */
}
def Function2()
{
for(i=0; i<=10; i++)
{
call Function1()
}
}
当事物根据其自身或其类型进行定义时,就会发生递归。递归用于从语言学到逻辑学的各种学科。递归最常见的应用是在数学和计算机科学中,其中定义的函数应用在其自己的定义中。虽然这显然定义了无限数量的实例(函数值),但它通常以不会出现循环或无限引用链的方式完成。
来源。
所以,如果你有一个foo
and为了计算或执行foo,你需要foo
至少再递归一次,那么你就有了递归。例子:
啊!= 1 * 2 * 3 * ... * n
这是一个迭代定义:
int fact(n) {
int ret = 1;
int i = 1;
while (++i < n) ret *= i;
return ret;
}
这是一个递归定义:
int fact(n) {
return (n == 1) ? 1 : (n * fact(n - 1));
}
由于您的代码Function2
使用 的多次使用进行计算Function1
,因此它不是递归的,因为您不需要调用Function2
来评估Function
2,也不需要调用Function1
来评估Function1
. 当某些东西是它自己的依赖项时,就会发生递归,而您的代码有一个依赖于另一个函数的函数。您关于性能的问题几乎无法回答,因为有无数种方法可以使用递归或不使用递归来实现事物,当您将递归方法与非递归方法进行比较时,您需要有具体的实现,或者至少非常如何实施这两个案例的严格想法。但是,一般而言,首选非递归方法是个好主意,因为递归方法通常会在内存的堆栈部分出现问题,包括堆栈溢出或无限函数调用以及由于错误导致的崩溃。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句