我对递归的了解是,函数调用自身并且它具有停止的基本条件。我的教授写了一个程序,他称其中的递归正在发生,我说不,它不是。我很困惑。所以我要求你清除我的困惑。他编写的程序如下:
int fact(int n) {
if (n == 0) {
return 1;
}
for (int i = n; i >= 1; i--) {
s1.push(i);
}
return Return_result();
}
int Return_result() {
int f = 1;
while (s1.top != -1) {
f = f * s1.pop();
}
return f;
}
答案 0 :(得分:4)
你是对的,所提出的代码中没有递归。这是一种迭代方法。
递归是,如果在f()
方法(在Java命名法中)或函数(在一般情况下),您可以调用f()
。
递归方法将如下所示:
int fact(int n) {
return (n <= 1) ? 1 : fact(n - 1) * n;
}
或者,使用tail-recursion(也称为&#34;尾调用&#34;):
int fact(int n) {
return factTail(n, 1);
}
int factTail(int n, int accumulator) {
return (n <= 1) ? accumulator : factTail(n - 1, n * accumulator);
}
目前,JVM没有执行尾递归优化,但是this can change:
值得注意的是,这不是JVM中的错误。这是一个 可以实现的优化以帮助功能程序员 谁使用递归,这在那些更常见和正常 语言。我最近在Oracle与Brian Goetz谈过此事 优化,他说它是在要添加的事物列表中 JVM,但它不是一个高优先级的项目。现在,它是最好的 如果可以的话,通过深度避免来自己进行优化 在JVM上编写函数式语言时的递归函数。
答案 1 :(得分:1)
首先我要解释一些事实:
n! = n * n-1 * n-2 * n-3 * .....* 3 * 2 * 1
LIFO = last in first out
或FILO = first in last out
所以代码执行以下操作首先将所有数字从n放到堆栈中,然后弹出每个数字并将其与当前结果相乘以得到最后的阶乘
并且通过对于阶乘(非递归)的迭代版本的方式,递归版本将如下所示
int fact(int n)
{
int result;
if(n==1)
return 1;
result = fact(n-1) * n;
return result;
}