2014-10-19 98 views
-3
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); 
} 

这是调用mystery(7,5)时的算法,输出是21.我只是不知道这个算法是如何工作的,任何帮助都会受到欢迎。需要帮助理解算法

+6

使用铅笔和纸,玩电脑。 – 2014-10-19 00:49:06

+0

神秘(7,5)=神秘(6,5)+神秘(6,4)= ...继续:) – 2014-10-19 00:52:27

+0

我明白,我不明白的是输出是如何21.不应该它是1,因为基本情况会返回1?我对此感到困惑,应该很简单,但我无法掌握这里发生的事情。 – Fredamabob 2014-10-19 00:56:43

回答

-1

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

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

+0

我明白,我不明白的是输出是21.如果不是1,因为基本情况会返回1?我对此感到困惑,应该很简单,但我无法掌握这里发生的事情。 – Fredamabob 2014-10-19 00:57:47

+0

@Fredamabob:基本情况返回1,但整个递归调用树正在总结所有基本情况。 – Blastfurnace 2014-10-19 01:00:58

+0

@Blastfurnace哦..我觉得没有抓住这个蠢事,我现在明白了。 – Fredamabob 2014-10-19 01:03:53

-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 

我只是没被模仿(大致)由函数的递归调用数学

-1

我建议你通过你的程序来了解发生了什么。

拿一张纸,画一个盒子。里面那个盒子,写:

m = 7, n = 5 

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

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

然后,画出低于两个箱,使用相同的数据,一个用于函数中每次调用谜。重复,直到每个到达基本情况。

当您到达函数的基本大小写时,绘制一个箭头指向任何称为它的“框”。然后,总结一下你的条款。

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