Java Can';我不理解在这个例子中递归是如何工作的

Java Can';我不理解在这个例子中递归是如何工作的,java,recursion,Java,Recursion,我得到了以下代码: public int func(int n){ if(n == 1) return 2; else return 3 * func(n-1)+1; } 我可以理解像阶乘和斐波那契这样的递归,但对于这一点我不能理解。 我试图追溯逻辑: if n is 3: return 3 * func(2) + 1 return 3 * func(1) + 1 return 3 * 2 + 1 return 7 我总是以7和其他任何数字结束,我知道这是错误的

我得到了以下代码:

public int func(int n){
  if(n == 1)
     return 2;
  else 
     return 3 * func(n-1)+1;
}
我可以理解像阶乘和斐波那契这样的递归,但对于这一点我不能理解。 我试图追溯逻辑:

if n is 3:
return 3 * func(2) + 1
return 3 * func(1) + 1
return 3 * 2 + 1
return 7

我总是以7和其他任何数字结束,我知道这是错误的,因为我在运行程序时得到不同的值。你能帮我理解递归是如何工作的吗?

我认为这是不言自明的,如果你需要更多信息,请发表评论

if n is 3:
return 3 * func(2) + 1
return 3 * (3 * func(1) + 1) + 1 //func(2) is equals to 3 * func(1) + 1
return 3 * (3 * 2 + 1) + 1 //func(1) is equals to 2
return 22
如果n是3

func(3)
=3*func(2)+1
=3*(3*func(1)+1)+1
=3*(3*2+1)+1
=22
如果n是4

func(4)
=3*func(3)+1
=3*22+1
=67

您很接近,但缺少一个关键点:

func(3) is: 3 * func(2) + 1
func(2) is: 3 * func(1) + 1
func(1) is: 2

Therefore, func(2) is 3*2+1 = 7.
And func(3) is 3*7+1 = 22 

您必须将最深递归调用得到的值重新放入上一级,以此类推

func(1) = 2
func(2) = 3 * func(1) + 1 = 7
func(3) = 3 * func(2) + 1 = 22
func(4) = 3 * func(3) + 1 = 67
  • 如果
    n
    为1,则返回
    2
    (因此
    func(1)=2
  • 如果
    n
    为2,则返回
    3*func(1)+1
    ,即
    3*2+1=7
    (因此
    func(2)=7
  • 如果
    n
    为3,则返回
    3*func(2)+1
    ,即
    3*7+1=22
    (因此
    func(3)=22
  • 如果
    n
    为4,则返回
    3*func(3)+1
    ,即
    3*22+1=67
    (因此
    func(4)=67

等等。换句话说,当
n=1
时,它只返回2,而在所有其他情况下,它返回
func(n-1)
的值乘以3,再加上1。

n=3

func(3) = > return 3 * func(2) + 1
其中
func(2)

func(2) = > return 3 * func(1) + 1
其中
func(1)

func(1) = > return 2
一旦你把它们结合起来,你就得到了

func(3) => return 3 * (3 * (2) + 1) + 1

func(3) => return 22

一般来说,递归方法分为两部分

  • 在你们的例子中,解决原始问题的部分是 如果(n==1) 返回2

  • 将问题划分为较小问题的部分,以便最终归入第1部分(原始问题) 其他的 返回3*func(n-1)+1

  • 这正是分而治之算法的本质,该算法倾向于在每一轮中将问题分成更小的部分,直到问题变得可解为止。然后通过连接已解决的部分,原始问题得到解决