-1

我试图理解为什么以下函数对于我给它们的任何输入都输出为零。我会认为,基于将 2 输入到函数 g 的递归性质,会产生 12。我似乎用于任一函数的任何整数都只会输出 0。谁能指出我在思考过程中出错的地方?

public class dsdsfsd {
    public static int i(int n) {
        if (n == 0) return 0;
        return i(n-1) + g(n-1);
    }

    public static int g(int n) {
        if (n == 0) return 0;
        return g(n-1) + i(n);
    }

    public static void main(String[] args) {
        int a = 2;
        System.out.println(g(a));
        System.out.println(i(a));
        System.out.println(g(g(a)));
    }
}
4

4 回答 4

3

当然。这些函数可以返回的唯一值是 0。这是基本情况,更高的情况只会将这些零相加。你在哪里看到另一个值进入方程?

于 2016-10-21T21:43:16.930 回答
2
  • 如果任一函数的参数为​​零,则返回 0。
  • 如果它有任何其他值,则返回两个递归调用的总和。
  • 两个零之和为零。

您究竟希望该函数在哪里产生除零之外的任何东西?

于 2016-10-21T21:43:26.150 回答
0

您的问题不在于重复出现,而在于变量的初始化。

我认为您尝试通过以下公式计算一些链接系数:

  • g(n) = g(n-1) + i(n)
  • i(n) = i(n-1) + g(n-1)
  • g(0) = 0
  • i(0) = 0

但是,当您将 g 和 i 初始化为 0 时,i(1) = g(0) + i(0) = 0 + 0 = 0,并且 g(n) 或 i(n) 的任何值对于相同的原因是:您不断添加 0 和 0。

相反,如果您想要一个非空结果,您应该至少更改一个初始化,例如:

  • g(0) = 1
  • i(0) = 1

这样,你有 i(1) = g(0) + i(0) = 1 + 1 = 2 和 g(1) = g(0) + i(1) = 1 + 2 = 3。

这最终更多的是一个数学问题。

于 2016-10-21T21:48:51.803 回答
0

为简单起见,您可以将其简化为单个函数,因为相互递归是无关紧要的:

public static int func(int n) {
     if (n == 0) return 0;
     return func(n-1);
}

请注意,只有两种方法可以返回:

  • 它可以在基本情况下直接返回 0
  • 它可以返回递归的结果。

考虑一下。在某些时候,它必须停止递归(否则它将永远运行)。当返回基本情况 0 时会发生什么?你的函数变成了这样的东西(当然只是为了想象的目的):

public static int func(int n) {
     if (n == 0) return 0;
     return 0;
}

因此,0 是您的函数能够返回的唯一值,因为它是唯一返回的具体值。

于 2016-10-21T21:51:31.657 回答