需要帮助理解算法

时间:2014-10-19 00:43:36

标签: java algorithm

public static int mystery (int m, int n){
    if (n==0||n==m)
        return 1;
    return mystery (m-1, n) + mystery(m-1, n-1);
}

这是算法,当调用神秘(7,5)时,输出为21.我只是不确定这个算法是如何工作的,任何帮助都会受到欢迎。

3 个答案:

答案 0 :(得分:-1)

此算法是递归的典型示例。有一个非常简单的例子来解释它:拿两个镜子放在彼此的前面 - 你会看到什么?无数个镜子:所以这里是相同的。当条件为假时,该函数会一次又一次地调用自己,直到“ ”为止。是0或等于' m'。

打开Excel并逐步计算它。 这是否回答了你的问题?

答案 1 :(得分:-1)

这只是递归定义的数学。

M(7, 5) = M(6, 5) + M(6, 4)
M(6, 5) = M(5, 5) + M(5, 4) = 1 + M(5, 4)
M(6, 4) = M(5, 4) + M(5, 3)
M(5, 4) = M(4, 4) + M(4, 3) = 1 + M(4, 3)
M(5, 3) = M(4, 3) + M(4, 2)
M(4, 3) = M(3, 3) + M(3, 2) = 1 + M(3, 2)
M(4, 2) = M(3, 2) + M(3, 1)
M(3, 2) = M(2, 2) + M(2, 1) = 1 + M(2, 1)
M(3, 1) = M(2, 1) + M(2, 0) = M(2, 1) + 1
M(2, 1) = M(1, 1) + M(1, 0) = 1 + 1 = 2

现在我们可以“放松”递归,代替找到答案:

M(3, 1) = M(2, 1) + M(2, 0) = M(2, 1) + 1 = 2 + 1 = 3
M(3, 2) = M(2, 2) + M(2, 1) = 1 + M(2, 1) = 1 + 2 = 3
M(4, 2) = M(3, 2) + M(3, 1) = 3 + 3 = 6
M(4, 3) = M(3, 3) + M(3, 2) = 1 + M(3, 2) = 1 + 3 = 4
M(5, 3) = M(4, 3) + M(4, 2) = 4 + 6 = 10
M(5, 4) = M(4, 4) + M(4, 3) = 1 + M(4, 3) = 1 + 4 = 5
M(6, 4) = M(5, 4) + M(5, 3) = 5 + 10 = 15
M(6, 5) = M(5, 5) + M(5, 4) = 1 + M(5, 4) = 1 + 5 = 6
M(7, 5) = M(6, 5) + M(6, 4) = 15 + 6 = 21

我刚刚做的数学模拟(粗略地)是函数的递归调用

答案 2 :(得分:-1)

我建议你通过程序跟踪一下,了解发生了什么。

拿一张纸,画一个盒子。在该框中,写下:

m = 7, n = 5

Is n == 0 or n == m? (y/n)

return mystery(6,5) + mystery(6,4)

然后,在相同的数据下方绘制两个框,每个函数调用一个神秘的函数。重复,直到每个人到达基本案例。

当你到达函数的基本情况时,绘制一个箭头指向任何称为它的“框”。然后只是总结你的条款。

此方法适用于每个递归函数,是一个强大的工具。