将迭代方法转换为递归方法(Java)
对于我在uni的离散结构类,我需要编写一个方法来解决以下公式: s[0]=1 s[n-1]=s[n-2]+n表示所有n>=2 不幸的是,我以前没有实现过很多递归方法,所以我真的不知道我在做什么。事情对我来说并不像平常那样“咔哒”一声 我非常感谢任何可能的帮助,但我更愿意完全理解这一点,而不仅仅是复制粘贴别人的作品 如果n=8,该方法应实现的基本示例 1+2=3 3+3=6 6+4=10 10+5=15 15+6=21 21+7=28 28+8=36,我们的答案。 我已经写了一个非递归(如下所示)解决这个问题的方法,所以我理解它背后的数学原理将迭代方法转换为递归方法(Java),java,methods,recursion,Java,Methods,Recursion,对于我在uni的离散结构类,我需要编写一个方法来解决以下公式: s[0]=1 s[n-1]=s[n-2]+n表示所有n>=2 不幸的是,我以前没有实现过很多递归方法,所以我真的不知道我在做什么。事情对我来说并不像平常那样“咔哒”一声 我非常感谢任何可能的帮助,但我更愿意完全理解这一点,而不仅仅是复制粘贴别人的作品 如果n=8,该方法应实现的基本示例 1+2=3 3+3=6 6+4=10 10+5=15 15+6=21 21+7=28 28+8=36,我们的答案。 我已经写了一个非递归(如下所示
public static int sequenceNonRecursive(int n){
int[] s = new int[n];
s[0] = 1;
if(n >= 2){
for(int i = 1; i < n; i++){
s[i] = s[i-1] + i + 1;
}
}
return s[n-1];
}
公共静态int序列非递归(int n){
int[]s=新的int[n];
s[0]=1;
如果(n>=2){
对于(int i=1;i
编辑:我解决了它。谢谢大家的帮助!请看下面我的答案。将您的代码按如下方式构造(只是给出提示,让您找出问题的其余部分):
递归就像将原始问题分解成子问题并试图解决它们。首先,您需要找出基本情况(在您的情况下是
n=0
)。现在,您可以继续前进,看看如何通过将n>0
分解为基本情况来处理这些情况。为n
然后n-1
然后n-2
等等创建序列,直到达到基本情况为止,这是递归解决此问题的关键。让我们首先在第二个等式中的所有n
中添加1:(如果我们增加它们,我们需要减小范围,因为它是正确的,应该是微不足道的)
我们为什么要这样做?简而言之,函数定义是
sequence(intn)
,而不是sequence(intn-1)
这里的s[i]
只对应于使用输入参数i
调用函数
代码的基本思想是:
public static int sequence(int n){
if (/* base case */)
// return value for base case
else
// return other case, includes calling sequence(x) for some x
}
希望这能给你足够的时间来工作。实际上更容易。假设您的方法适用于所有n,除非n为零(基本情况) 获取上一个数字的值并期望它正常工作。(而且会)
在引擎盖下,它将递归到基本情况,并在调用返回时建立值。递归的定义有点奇怪。我会重写它: S0=1
Si=Si-1+i+1-∀ i>0 该例程可以简化为不使用数组:
public static int sequenceNonRecursive (int n) {
int S_0 = 1; // 0th term is 1
int S_i = S_0; // S_i starts at S_0
for(int i = 1; i <= n; i++) {
int S_i_minus_1 = S_i; // use previous result to calculate next
S_i = S_i_minus_1 + i + 1; // next is previous added with index plus 1
}
return S_i;
}
然后,可以将此函数的主体更改为调用递归函数:
public static int someFunction (int n) {
return someFunctionWithRecursion(n, 0, DEFAULT_RESULT);
}
请注意,局部变量的初始值是如何转换为递归例程的参数的。因此,递归例程本身可能如下所示:
public static int someFunctionWithRecursion (int n, int i, int result) {
if (! (i < n)) {
return result;
}
result = UPDATE_RESULT(i, n, result);
return someFunctionWithRecursion(n, i+1, result);
}
带有递归的公共静态int-somefunction(int-n,int-i,int-result){
如果(!(i
请注意,在递归调用中,结果
已经更新,控制变量i
已经增加,就像迭代在原始的for()
循环版本的代码中所做的那样
顺便说一句:您正在处理的循环实际上有一个封闭的形式:
序号=(½)(n+1)(n+2)
我明白了,伙计们。谢谢大家的帮助!我不敢相信这是多么愚蠢的简单。我一弄明白,就给了自己一个有力的掌心。我很确定我现在理解递归了
public static int sequenceRecursive(int n){
if( n == 0 )
return 0;
else
return n + sequenceRecursive(n-1);
}
你确定这是对的吗?您打算
sequenceNonRecursive(0)
返回什么?@jxh:顶部指定的OPsequenceNonRecursive(0)==1
。如果你碰巧因为这个原因否决了这个问题,请撤销否决票。@music_coder:不是我的否决票(我不否决)<代码>序列非递归(0)将导致返回s[-1]
,我想知道这是否是出于设计,因为它会影响递归解决方案。每个发表评论的人都帮了我的忙(谢谢大家!),但我认为你的回答是最简洁的。“我弄明白了。”德雷克德林农很高兴我能帮上忙。一定要找到最有帮助的。
public static int someFunction (int n) {
int result = DEFAULT_RESULT;
for (int i = 0; i < n; ++i) {
result = UPDATE_RESULT(i, n, result);
}
return result;
}
public static int someFunction (int n) {
return someFunctionWithRecursion(n, 0, DEFAULT_RESULT);
}
public static int someFunctionWithRecursion (int n, int i, int result) {
if (! (i < n)) {
return result;
}
result = UPDATE_RESULT(i, n, result);
return someFunctionWithRecursion(n, i+1, result);
}
public static int sequenceRecursive(int n){
if( n == 0 )
return 0;
else
return n + sequenceRecursive(n-1);
}