Java 相互递归函数

Java 相互递归函数,java,mutual-recursion,Java,Mutual Recursion,我试图理解为什么下面的函数对于我给它们的任何输入都输出零。我本以为,基于递归性质,将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

我试图理解为什么下面的函数对于我给它们的任何输入都输出零。我本以为,基于递归性质,将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)));
    }
}

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

  • 如果任一函数的参数为零,则返回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


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

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

public static int func(int n) {
     if (n == 0) return 0;
     return func(n-1);
}
请注意,只有两种方法可以返回:

  • 它可以在基本情况下直接返回0
  • 它可以返回递归的结果
想想看。在某个时刻,它必须停止递归(否则它将永远运行)。返回0的基本大小写时会发生什么情况?您的函数会变成这样(当然,仅用于想象目的):

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

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