递归和递归方法

时间:2014-08-08 04:45:33

标签: java recursion

我正在为我的计算机科学考试而学习,并且正在回顾我们在课堂上讨论时从未完全掌握的一些事情。主要是递归。我想我已经掌握了简单的递归示例,但我正在尝试通过以前的考试,并且无法弄清楚应该如何完成。

以下是问题:

Texas numbers (Tx(n)) are defined as follows for non-negative numbers (assume true):
Tx(n) = 10                        if n is 0
Tx(n) = 5                         if n is 1
Tx(n) = 2*(Tx(n-1) + Tx(n-2)      if n >= 2

然后我们要为德克萨斯州的数字编写递归函数,经过测试后的一些修正,这是我提出的,我认为是对的,但不是100 %%。

public int Tx(int n) {
    if(n == 0)
        return 10;
    else if (n == 1)
        return 5;
    else
        return 2*(Tx(n-1) + Tx(n-2));
}

然后我们被要求计算Tx(5)的值。这就是我被困的地方。如果else的return语句只是n-1,我想我能够弄清楚,但是n-1 + n-2完全让我失望。

任何人都可以解释这是如何工作的,或者分享一些具有相似示例的链接。我已尝试在网上和我的教科书中查看这些内容,但我发现的例子要么是先进的,要么我不知道发生了什么,或者他们只处理类似返回n-1的内容,我已经知道怎么做了。

4 个答案:

答案 0 :(得分:4)

您的实施很好,只有一个小错误 - 在条件中您应该将=替换为== - 这不是作业 - 这是一个比较。

顺便说一句,您期望您的方法返回Tx(-1)

答案 1 :(得分:4)

让我们从Tx(2)开始。 n> 1,所以我们2*(Tx(n-1) + Tx(n-2)) 2*(Tx(1) + Tx(0))

但我们已经知道Tx(1)和Tx(0)了!所以只需替换它们就可以获得2*(5 + 10) -> 30。很好,所以现在我们知道T(2)。

T(3)怎么样? 2*(Tx(2) + Tx(1))。很好,我们也已经知道了这些:)再次,只需填写它们即可获得2*(30 + 5) -> 70

你可以前进到Tx(5)。

您的代码在逻辑上是正确的,您应该使用==来测试相等性,单个=用于分配。

当你运行你的方法时,它将向后工作并解决越来越小的子问题,直到它到达答案已知的点,这些是你的基本情况。

                    Tx(3)
  2*    Tx(2)         +        Tx(1)
  2*Tx(1) + Tx(0)               (5)
     (5)     (10)

为了使递归起作用,无论你每次做什么来将问题分解成更小的问题,都需要在基本情况下取得一些进展。如果它没有,你将无限地递归,直到你的计算机空间不足,以便将所有重复的调用存储到同一个函数。

public int Tx(int n) {
    if(n == 0)
        return 10;
    else
        return Tx(n+1); // n will never reach 0!
}

Tx(1)变为Tx(2) -> Tx(3) -> Tx(4) -> Tx(5)等。

答案 2 :(得分:4)

你已经实现了,只需改变= ==。
如果你想进一步减少时间复杂度,你可以将结果存储在函数的全局数组中,这样你的函数就不会一次又一次地为同一个数字计算结果,这样只会为你节省大量的计算时间。

你可以使用这样的东西。

public int tx(int n , int []arr) {
     if (arr[n] == 0) {
          if (n == 1) {
              arr[n] = 10;
          }
          else if (n == 2) {
              arr[n] = 5;
          }
          else {
              arr[n] = 2 * (tx((n - 1), arr) + tx((n - 2), arr));
          }
      }
      return arr[n];
}

答案 3 :(得分:3)

每当你向计算机询问值Tx(5)时,它会调用递归函数,因此程序将执行else部分,因为n = 5的值。   现在在else部分2*(Tx(n-1)+Tx(n-2))将被执行。

在第一次迭代中,它将变为2*((2*(Tx(3)+Tx(2)))+(2*(Tx(2)+Tx(1))))。迭代将继续,直到n的值变为0或1。