📜  门| GATE CS 1999 |问题16(1)

📅  最后修改于: 2023-12-03 14:58:18.893000             🧑  作者: Mango

门 | GATE CS 1999 | 问题 16

问题描述:

考虑以下C++代码片段:

        int f(int n)
        {
            if(n == 0) return 0;
            else return (f(n-1) + n);
        }

则,f(4) 的返回值是多少?

(A) 4 (B) 7 (C) 10 (D) 14

解析

这道问题是一道递归问题,f(n) 的定义为 n 如果等于 0,则返回 0,否则返回 f(n-1) + n。 根据这个定义,我们可以构造出递归树:

                                        f(4)
                                          |
                        ------------------ mi
                       |         |
                      f(3)      4
                       |         |
                -------mi      mi------
               |           |           |
              f(2)        3           4
               |           |           |
        -------mi        mi-----   mi----
       |           |           |       |
      f(1)         2           3       4
       |           |           |       |
  ...---        ...---      ...---  ...---

在递归树中,顶部的节点是 f(4)。当我们开始递归时,通过调用 f(3),我们到达了左子树中的下一个节点。然后,又通过调用 f(2) 到达了这棵子树的左子树中另一个节点(它是左子树中的最右侧节点)。像这样,我们每次递归调用,直到达到树的某个下的最左节点,此时,我们从递归函数中返回控制,回到调用他的节点。这是以一个类似的方式进行的,直到我们到达树的最右侧。

因此,我们可以看到以下模式:每个节点都会调用其左子节点,直到到达最左侧节点(这被称为递归条件),然后在每个节点处对左子树进行优先遍历。因此,递归树是左深度优先树。回顾我们关于函数 f() 的定义,我们也可以看出这是一种深度优先搜索。 深度优先搜索通常倾向于使用堆栈支持递归的方式实现。

接下来,我们可以开始计算 f(4) 的值。对于 f(4) 来说,我们需要计算 f(3) 的值。 f(3) 等于 f(2) + 3,因此我们需要计算 f(2) 的值。 f(2) 是 f(1) + 2, 我们要求解 f(1) 的值。由于 f(1) 可以由 f(0) + 1 得出,而在 f(0) 的定义中,我们返回 0。因此, f(4) 的值可以计算如下:

f(4) = f(3) + 4
     = (f(2) + 3) + 4
     = ((f(1) + 2) + 3) + 4
     = (((0 + 1) + 2) + 3) + 4
     = 10

因此,选择 (C) 10 作为正确答案。

代码片段
  int f(int n) {
    if (n == 0) {
      return 0;
    } else {
      return (f(n-1) + n);
    }
  }

  std::cout << f(4) << std::endl;  // 输出 10
分析

该代码段中定义了一个递归函数 f(n),如果 n 等于 0,则函数返回 0,否则它返回 f(n-1) + n。在主函数中,我们调用了 f(4),并将其输出到控制台。执行上述代码,将会打印 10。