在这个例子中无法理解递归是如何工作的

时间:2014-01-15 22:52:39

标签: java recursion

我收到了以下代码:

public int func(int n){
  if(n == 1)
     return 2;
  else 
     return 3 * func(n-1)+1;
}

我可以理解像factorial和fibonacci这样的东西的递归,但对于这个我不能。 我试图追踪逻辑:

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

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

7 个答案:

答案 0 :(得分:4)

我认为这是不言自明的,如果您需要更多信息只需评论!

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

答案 1 :(得分:2)

  • 如果n为1则返回2(所以func(1) = 2)。
  • 如果n为2则返回3 * func(1) + 1,即3 * 2 + 1 = 7func(2) = 7)。
  • 如果n为3则返回3 * func(2) + 1,即3 * 7 + 1 = 22func(3) = 22)。
  • 如果n为4则返回3 * func(3) + 1,即3 * 22 + 1 = 67func(4) = 67)。
  • ...

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

答案 2 :(得分:1)

如果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

答案 3 :(得分:1)

你很接近,但遗漏了一个关键点:

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 

答案 4 :(得分: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

答案 5 :(得分:0)

您必须将最深层递归调用所获得的值重新输入上一级别等等。

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

答案 6 :(得分:0)

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

  1. 解决原始问题的部分,在你的例子中是 if(n == 1) 返回 2;

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

这就是分而治之算法的本质,它倾向于在每一轮中将问题分成更小的部分,直到它们变得可解决。然后通过加入已解决的部分,原始问题得到解决。