首页 > 解决方案 > 如何修复此递归代码的执行?

问题描述

在这个基本的数组问题中,我需要使用递归将数组的前一个索引的总和或值添加到当前索引值。

例如,{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;
    }
   }

标签: javarecursion

解决方案


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被抛出。

您可以通过以下方式解决此问题:

  1. 在块return a;内添加一个。if (i==0)

  2. 拥有主函数以 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);
    }
   }

这将使代码更具可读性。


推荐阅读