我收到了以下代码:
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与任何其他数字结束,我知道这是错误的,因为我在运行程序时会得到不同的值。你能帮我理解递归是如何工作的吗?
答案 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 = 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的值并添加一个。
答案 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)
一般来说,递归方法有两个部分,
解决原始问题的部分,在你的例子中是 if(n == 1) 返回 2;
将问题划分为更小的问题以便最终归入第 1 部分(原始问题)的部分 其他 返回 3 * func(n-1)+1;
这就是分而治之算法的本质,它倾向于在每一轮中将问题分成更小的部分,直到它们变得可解决。然后通过加入已解决的部分,原始问题得到解决。