java - 如何修复此递归代码的执行?
问题描述
在这个基本的数组问题中,我需要使用递归将数组的前一个索引的总和或值添加到当前索引值。
例如,{5,3,1,2}
变成{5,8,9,11}
。
由于第 0 个索引是第一个索引,所以它保持原样。
我认为我的代码是正确的,但是根据我的试运行,指令指针没有流动,并且返回语句(对于基本条件)没有执行。由于我的代码是用 Java 编写的,因此在添加 try-catch 后,我得到了预期的输出。但是添加 try-catch 并不是解决方案。
class kr1
{
public static void main(String[] args) {
int a[]= {5,1,3,9,5};
a=addr (a,0,a.length);
for (int i:a)
System.out.print (i +" ");
}
static int[] addr(int a[],int i,int n)
{
if (i==0)
addr(a,i+1,n);
if (i==n-1)
{
a[i] = a[i]+a[i-1];
return a ; //this return statement is not executing
}
//this below part is executing even if i has reached to n-1
a[i] = a[i] + a[i-1];
addr(a,i+1,n);
return a;
}
}
解决方案
static int[] addr(int a[],int i,int n)
{
if (i==0)
addr(a,i+1,n); // buggy
if (i==n-1)
{
a[i] = a[i]+a[i-1];
return a;
}
// code executed after if (i==0) block returns
a[i] = a[i] + a[i-1];
addr(a,i+1,n);
return a;
}
由于块return a;
内没有if (i==0)
,后续代码块将被执行。由于 i 的值为 0,a[i-1]
因此等价于a[-1]
,这会导致ArrayOutOfBoundsException
被抛出。
您可以通过以下方式解决此问题:
在块
return a;
内添加一个。if (i==0)
拥有主函数以 i = 1 调用此递归函数。这样,您可以删除
if (i==0)
块。
由于 Java 数组是按引用传递的,因此您实际上不需要返回数组。
class kr1
{
public static void main(String[] args) {
int a[]= {5,1,3,9,5};
addr (a,0,a.length);
for (int i:a)
System.out.print (i +" ");
}
static void addr(int a[],int i,int n)
{
if (i==0)
addr(a,i+1,n);
return;
if (i==n-1)
{
a[i] = a[i]+a[i-1];
return;
}
a[i] = a[i] + a[i-1];
addr(a,i+1,n);
}
}
这将使代码更具可读性。
推荐阅读
- latex - 试图连接流程图乳胶中的两个盒子
- c# - 如果我以编程方式创建组件,如何使用文档大纲?
- python - 适用于 AWS S3 的 Python boto3 模拟单元测试
- javascript - 如何在 React Native 中创建国家和城市下拉菜单
- three.js - 另一个轴上的旋转动画
- android - Viewpager 适配器是在 Recyclerview 适配器中创建的
- java - 使用protobuf在java中发送19位长数组列表的最有效方法是什么
- javascript - 如果服务器断开连接,是否可以阻止表单提交?
- kepler.gl - 单击按钮更改 kepler.gl 的状态
- azure-devops - Azure Devops 中有关积压级别的查询