[英]Result of recursive method
我试图理解这种递归方法,但是即使使用调试器,我也无法解决对我来说有意义的事情,因此我希望这里的人有动力向我解释这里的情况。 我知道递归的工作原理,但是写下这种方法的方式困扰着我。 我知道Java中的条件运算符,我编写了一个新代码,但是仍然不明白,所以我期望这里是。
m(5)和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);
}
}
用这种方式编写它,使它更易于理解:
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 - 1) + m(n - 3)
计算任何m(n)
,其中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
等等...
铅笔和纸是您的朋友。
有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
伪代码中的方法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
> 2,则乐趣开始。 以n=3
为例。 由于3
大于2
,因此我们需要运行第三个if
。 当我们看那条线时,我们看到nee返回m(n - 1) + m(n - 3)
。 插入n = 3
后,它看起来像是: m(3 - 1) + m(3 - 3)
,或更简单地说,是这样的: m(2) + m(0)
。 现在这将以1
终止,因为n
2
或0
都不会导致m
更多调用。
现在我们有了一些了解,现在我们可以锻炼m(15)
和m(5)
会返回什么。
我只会计算5
因为15
的调用栈会很长
m(5)
/ \
m(5-1) + m(5-3)
/ \ |
m(4-1) + m(4-3) |
/ \ | |
m(3-1) + m(3-3) | |
| | | |
1 + 0 + 0 + 1
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(2)
并将结果加到第一行之前会先计算m(4)
-发生这种情况是由于递归函数中的插补顺序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.