递归方法的结果

时间:2015-05-08 17:58:52

标签: java algorithm recursion

我正在尝试理解这种递归方法,但即使使用调试器,我也无法找到对我有意义的东西,所以我希望这里有人有动力向我解释这里发生了什么。我知道递归基本上是如何工作的,但这种方法写下来的方式让我很烦恼。 我知道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);
    }

}

4 个答案:

答案 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是终端操作,根据输入返回01。如果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的调用。

现在我们已经了解了一些我们现在可以锻炼mm(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)立即替换为1m(n<=1)立即替换为0。这是你如何在纸上分析这个。然而,计算机在计算m(4)之前会先计算m(2)并在第一行添加结果 - 这是因为递归函数中的值的顺序。