相互递归的函数

时间:2016-10-21 21:40:13

标签: java mutual-recursion

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

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 个答案:

答案 0 :(得分:3)

不确定。这些函数可以返回的唯一值是0.这是基本情况,较高的情况除了加上那些零之外什么都不做。你在哪里看到另一个值进入等式?

答案 1 :(得分:2)

  • 如果任一函数的参数为​​零,则返回0.
  • 如果它有任何其他值,则返回两次递归调用的总和。
  • 两个零的总和为零。

您希望函数在哪里产生零?

答案 2 :(得分: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和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。

这最终是一个数学问题。

答案 3 :(得分: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是您的函数能够返回的唯一值,因为它是唯一返回的具体值。