我在理解递归概念时遇到了一些麻烦。我知道它基本上是一种自称并将一个大问题变成一堆较小部分来解决它的方法。我遇到的困难是使用数组的递归。这是我书中的一个例子:
//Precondition: x is an array of n integers
public int recur(int[] x, int n)
{
int t;
if(n == 1)
return x[0];
else
{
t = recur(x, n-1);
if(x[n-1] > t)
return x[n-1];
else
return t;
}
}
如果有人有时间,你能解释一下这种方法的作用及其工作原理吗?非常感谢!
答案 0 :(得分:3)
此函数返回整数数组的最大整数。
让我们看一下,你的函数recur采用整数数组x及其长度n。
如果数组的长度为1,则单个元素x [0]是最大的。
否则我们得到从x [0]开始到x [n-2]的数组中最大的元素(即长度为n-1的数组),依此类推,当我们得到最大的元素时,我们继续发送它作为返回值直到递归完成,最后返回最大值。
答案 1 :(得分:2)
此方法在数组的第一个n
元素中查找最大数字。
通过找到第一个n-1
元素中的最大数字来工作;然后检查n
元素是否更大。递归在它找到第一个n-1
元素中的最大数字时出现 - 它通过用n-1
代替n
调用自身来实现。
当然,如果n
为1,则无需检查 - 我们应该只返回第一个元素。这是递归的“基本情况”。
请注意,当我说n
元素时,这实际上是x[n-1]
,而不是x[n]
,因为数组索引从零开始。
答案 2 :(得分:0)
在递归中,我们有所谓的基本情况,这是使递归停止的条件。在这种情况下,基本情况为if (n==1)
,其中返回x[]
的第一个元素。
让我们进入递归的第二部分。该函数调用自身但递减n
,直到达到基本情况。返回基本案例后,函数会将第一个元素(t
)与下一个元素x[n-1]
(n
等于2
)进行比较并返回两者都更大。当返回一个值时,该函数将转到堆栈中的先前调用。
换句话说,为了分析递归,你应该通过函数调用,直到达到基本情况,然后在那里,开始返回由返回或函数的最终执行引导。
答案 3 :(得分:0)
如上所述,这个方法将在数组的前n个值中返回最大值,我想以图形方式显示这个答案
假设数组包含值 {5,4,2,1,8,6,4,2,12,33}
-----------------------------------------------------------------------------------
caller | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1
===================================================================================
t | 12 | 8 | 8 | 8 | 8 | 5 | 5 | 5 | 5 | none
===================================================================================
return | 33 | 12 | 8 | 8 | 8 | 8 | 5 | 5 | 5 | 5
这里调用者是递归方法的调用者。在n = 10
中,33将与12进行比较,33将返回给调用者。因此,调用者将获得阵列中最大的值。