我正在尝试理解这种递归方法,但即使使用调试器,我也无法找到对我有意义的东西,所以我希望这里有人有动力向我解释这里发生了什么。我知道递归基本上是如何工作的,但这种方法写下来的方式让我很烦恼。 我知道java中的条件运算符,我编写了一个新代码,但我仍然不理解它,所以我期待的是。
m(5)AND m(15)的结果是什么。你是怎么计算的?感谢
在答案后编辑。我为未来的读者制作了一张结果表
m(n)::|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|...
result|0|0|1|1|1|2|3|4|6|9|13|19|28|41|60|88|...
我只用我的程序检查了15的结果。
public class practice {
/**
* Try to understand the way this works
* @param n
* @return
*/
static long m(long n) {
return n <= 1 ? 0 : n == 2 ? 1 : m(n - 1) + m(n - 3);
}
/**
* This is what i tried so far.
* @param n
* @return
*/
static long ma(long n) {
System.out.println("Method called");
System.out.println("N is: " + n);
if (n <= 1) {
System.out.println("N<=1: " + n);
System.out.println("0 is returned");
return 0;
} else if (n == 2) {
System.out.println("N==2: " + n);
System.out.println("1 is returned");
return 1;
} else {
System.out.println("Inside ELSE, N is: " + n);
return ma(n - 1) + ma(n - 3);
}
}
public static void main(String[] args) {
ma(15);
}
}
答案 0 :(得分:4)
以这种方式写出来让它更容易理解:
m(0) = 0
m(1) = 0
m(2) = 1
m(n) = m(n - 1) + m(n - 3) // n >= 3
当我们知道m(0)
,m(1)
和m(2)
的值时,我们可以使用m(n)
计算任何n >= 3
,其中m(n - 1) + m(n - 3)
。对于任何负输入,结果为0。
例如:
m(3) = m(3 - 1) + m(3 - 3) = m(2) + m(0) = 1 + 0 = 1
m(4) = m(4 - 1) + m(4 - 3) = m(3) + m(1) = 1 + 0 = 1
m(5) = m(5 - 1) + m(5 - 3) = m(4) + m(2) = 1 + 1 = 2
等等......
答案 1 :(得分:3)
铅笔和纸是你的朋友。
有3个案例(其中两个是基本条件)
if n <= 1 then return 0
if n == 2 then return 1
else recursive call to m(n-1) + m(n-3)
所以你知道,在每次递归调用中,我们都接近其中一个基本条件。
以下是m(5)
m(5)
m(4) + m(2)
m(3) + m(1) return 1
m(2) + m(0) return 0
return 1 return 0
添加所有返回值1 + 0 + 0 + 1
2
所以
m(5) == 2
答案 2 :(得分:3)
伪代码中的方法m
。 (这是某种scala / python混搭)
def m (number n)
if (n <= 1) 0
else if (n == 2) 1
else m(n - 1) + m(n - 3)
查看此信息,您可以看到任何<= 2
是终端操作,根据输入返回0
或1
。如果n
是&gt; 2,乐趣开始了。以n=3
为例。由于3
大于2
,我们需要运行第三个if
。当我们查看该行时,我们发现我们需要返回m(n - 1) + m(n - 3)
。插入n = 3
,它看起来像这样:m(3 - 1) + m(3 - 3)
,或更简化,如下所示:m(2) + m(0)
。现在,这将以1
终止,因为2
的{{1}}或0
都不会导致更多n
的调用。
现在我们已经了解了一些我们现在可以锻炼m
和m(15)
会返回的内容。
我只会为m(5)
解决这个问题,因为5
的调用堆栈会很长
15
希望它有所帮助!
答案 3 :(得分:2)
m(5) = m(4)+m(2) // 5>2, so the third condition
m(4) + m(2) = m(3)+m(1) + 1 // 4>2, so the third condition
m(3) + m(1) + 1 = m(2)+m(0) + 0 + 1 // 3>2, so the third condition
m(2) + m(0) + 0 + 1 = 1 + 0 + 0 + 1 = 2
现在,在转换之间,m(2)
立即替换为1
,m(n<=1)
立即替换为0
。这是你如何在纸上分析这个。然而,计算机在计算m(4)
之前会先计算m(2)
并在第一行添加结果 - 这是因为递归函数中的值的顺序。