我无法理解这个例子。我理解递归函数的原理,但是在这个例子中,我无法理解forloop中的这种递归。 有人能解释一下这个例子吗?
#include <iostream>
using namespace std;
void f(int n)
{
cout << n;
for (int i=3; i<n; i=i+1)
f(n-1);
cout << n;
}
int main()
{
f(5);
return 0;
}
答案 0 :(得分:1)
f(5)将f(4)调用两次,即i = 3和4
f(4)将调用f(3)一次,即i = 3
f(3)不会进一步调用f因为3<3
为假
所以你有
f(5)
f(4)
f(3)
f(4)
f(3)
所以现在只需添加print:
f(5)
5 // on entry
f(4) // because i is 3, n is 5
4 // on entry
f(3) // because i is 3, n is 4
3 // on entry
// no further call because i is 3, n is 3
3 // on return
// no further call because i is 4, n is 4
4 // on return
f(4) // because i is 4, n is 5
4 // on entry
f(3) // because i is 3, n is 4
3 // on entry
// no further call because i is 3, n is 3
3 // on return
// no further call because i is 4, n is 4
4 // on return
// no further call because i is 5, n is 5
5 // on return
所以输出是
5433443345
答案 1 :(得分:-1)
它的工作方式与其他任何地方的递归相同。该函数调用自身。因为它处于循环中,所以可以多次这样做。
是什么导致你混淆?
我建议用一张纸踩一下,然后写下输出应该是什么。一直遵循逻辑。
答案 2 :(得分:-1)
对不起,这是在java而不是在C中,但我已经打了这个类型。 在我看来,这可能是最容易理解的递归算法。 因子5为120以供参考。
1. run through the code
2. write down the value of variables at each point
3. check the output with the correct answer
一旦你理解了这个更简单的递归算法再次运行你的复杂的例子,看看它是否更有意义。
Java示例:
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(fact(5));
}
public static int fact(int n){
if(n < 1){
return 1;
}
else{
return n*fact(n-1);
}
}
}
希望这有帮助!