如何在forloop中进行递归工作?

时间:2015-11-20 16:03:30

标签: c++ recursion

我无法理解这个例子。我理解递归函数的原理,但是在这个例子中,我无法理解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; 
}

3 个答案:

答案 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);
    }
}
} 

希望这有帮助!