【问题标题】:Recursion and Recursive Methods递归和递归方法
【发布时间】:2014-08-08 04:45:33
【问题描述】:

我正在为我的计算机科学期末考试而学习,并且正在回顾一些我在课堂上复习时从未完全掌握的东西。主要是递归。我想我已经掌握了简单递归示例的窍门,但我正在尝试完成之前考试中的一个示例,并且无法弄清楚应该如何完成。

问题来了:

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 完全让我失望。

谁能解释一下这是如何工作的,或者分享一些有类似例子的链接。我曾尝试在网上和我的教科书中查找此内容,但我发现的示例要么太先进以至于我不知道发生了什么,要么它们只处理诸如 return n-1 之类的东西,我已经知道该怎么做.

【问题讨论】:

  • 你试过用n的小值在纸上画吗?然后更大?
  • 这就是我想要做的事情,但是返回语句的后半部分让我失望了。
  • 为什么?如果f(n) = 2*n,那么f(3) + f(4)是什么?

标签: java recursion


【解决方案1】:

让我们从 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) 等等。

【讨论】:

  • 啊,我明白了。谢谢!我更正了 ==,我在考试中的那部分是正确的,但误认为他的分数(他在两个陈述的一个等号中间画了一个)和一个 -1 说写它好像(n==0) 是错误的,但事实证明他将它们标记为正确,而 -1 是针对另一个我已经更正的错误。
  • 所以它会从 Tx(5) 开始,然后到 Tx(4)、Tx(3) 等?还是我仍然没有得到它?
  • 没错,Tx(5) = 2*(Tx(4) + Tx(3)),然后它会计算出Tx(4) = 2*(Tx(3) + Tx(2))Tx(3) = 2*(Tx(2) + Tx(1)) 等等。
【解决方案2】:

你的实现很好,只有一个小错误 - 在条件下你应该用 == 替换 = - 这不是一个分配 - 这是一个比较。

顺便说一句,您希望您的方法为 Tx(-1) 返回什么?

【讨论】:

  • 哎呀,我是按照我在测试中得到的答案进行的,(我认为它是 if(n==0))但看起来他已经通过其中一个等号画了一个标记标志并写了-1。现在看它,我看到标记实际上是在说那部分是正确的,而 -1 是为了我已经更正的其他内容。有时很难判断他的分数是什么。
  • 我不确定,部分说明是假设输入的任何值都是正数。
  • @BethTanner 假设任何输入数字都是正整数,那么您的解决方案(减去上述更正)应该可以工作!
【解决方案3】:

您已经正确实现了,只需将 = 更改为 ==。
如果您想进一步降低时间复杂度,您可以将结果存储在函数的全局数组中,这样您的函数就不会一次又一次地为相同的数字计算结果,这只会为您节省一些时间进行大型计算。

你可以使用这样的东西。

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];
}

【讨论】:

    【解决方案4】:

    每当你向计算机询问 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 2021-12-24
      • 2012-10-22
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      相关资源
      最近更新 更多