Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要帮助理解算法吗_Java_Algorithm - Fatal编程技术网

Java 需要帮助理解算法吗

Java 需要帮助理解算法吗,java,algorithm,Java,Algorithm,这是算法,当调用神秘7,5时,输出是21。我只是不确定这个算法是如何工作的,欢迎任何帮助。这个算法是递归的典型例子。有一个非常简单的例子来解释它:拿两个镜子,把镜子放在彼此的前面——你会看到什么?无限多的镜子:所以这里是一样的。当条件为false时,函数会反复调用其自身,直到“n”为0或等于“m” 打开Excel,自己一步一步地计算。 这回答了你的问题吗?这只是递归定义的数学问题 public static int mystery (int m, int n){ if (n==0||n=

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

这个算法是递归的典型例子。有一个非常简单的例子来解释它:拿两个镜子,把镜子放在彼此的前面——你会看到什么?无限多的镜子:所以这里是一样的。当条件为false时,函数会反复调用其自身,直到“n”为0或等于“m”

打开Excel,自己一步一步地计算。
这回答了你的问题吗?

这只是递归定义的数学问题

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);
}
现在我们可以展开递归,替换以找到答案:

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
然后,用相同的数据在下面画两个框,每个框对应函数中的神秘调用。重复上述步骤,直到每个步骤都到达基本情况

当你到达一个函数的基本情况时,画一个箭头,指向调用它的任何“框”。那就总结一下你的条件吧


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

使用铅笔和纸,玩电脑。mystery7,5=mystery6,5+mystery6,4=。。。继续说:我明白,我不明白的是输出是如何的。它不应该是1吗,因为基本情况将返回1?我对此感到困惑,它应该很简单,但我无法理解这里发生了什么。它将所有调用相加,有一个简单的情况会返回1,但您的示例不是。我理解,我不理解的是输出是如何为21的。它不应该是1吗,因为基本情况将返回1?我对此感到困惑,它应该很简单,但我不能理解这里发生了什么。@Fredamabob:基本情况返回1,但整个递归调用树正在汇总所有基本情况。@blastfurne哦。。我现在明白了,我觉得自己很蠢,因为我没有抓住那个,但是。。。更有趣的是,我在XamarinStudioforOSX中运行了这段代码,收到了…堆栈溢出:D
m = 7, n = 5

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

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