Java 递归和递归方法

Java 递归和递归方法,java,recursion,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

我正在为我的计算机科学期末考试而学习,我将回顾一些我在课堂上复习时从未完全掌握过的东西。主要是递归。我想我已经掌握了简单递归示例的诀窍,但我正在努力完成上一次考试中的一个示例,并且在弄清楚应该如何完成时遇到了困难

问题是:

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之类的东西,我已经知道怎么做了

您的实现是好的,只有一个小错误-在您应该用
=
替换
=
的条件下-这不是一个赋值-这是一个比较

顺便问一下,对于
Tx(-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)
等。

请参阅,每当您向计算机询问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

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

你可以用这样的东西

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

您是否尝试过在纸上用较小的
n
值绘制它?然后更大?这就是我想做的,但返回声明的后半部分一直让我不舒服。为什么?如果
f(n)=2*n
,那么
f(3)+f(4)
是什么?哎呀,我是按照我在测试中得到的答案来做的,(我的答案好像是(n==0)),但看起来他好像是通过一个等号画了一个标记,然后写了-1。现在看着它,我看到马克实际上是在说那部分是正确的,-1代表我后来纠正的其他东西。有时很难判断他的分数是什么意思哈。我不确定,部分指导是假设输入的任何值都是正的。@Bethtaner假设输入的任何数字都是正整数,那么你的解决方案(减去上面提到的更正)应该有效!啊,好的,我明白了。谢谢我更正了==,我在考试中把那部分更正了,但是把他的分数(他在两个陈述中的一个等号中间画的)和a-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))
等等。