【问题标题】:adding elements of another arraylist by recursion-java通过 recursion-java 添加另一个数组列表的元素
【发布时间】:2014-12-17 05:28:09
【问题描述】:

这是一个方法,它应该简单地创建一个新的 ArrayList,复制参数 ArrayList arrlist 的所有元素,我认为我做得正确。

public ArrayList<T> copy (ArrayList<T> arrlist) {
        ArrayList<T> um=new ArrayList<T>();
        for (int i=0;i<arrlist.size();i++)
            um.add(arrlist.get(i));
        return um;

但是,我想编写这个完全相同的方法,只使用没有循环的递归。这是我写的。复制方法使用递归辅助方法。

public ArrayList<T> copy(ArrayList<T> arrlist) {
    return copy(arrlist,0); 
}

private ArrayList<T> copy(ArrayList<T> arrlist, int n) {
    ArrayList<T> um=new ArrayList<T>();
    if (n<arrlist.size())
        um.add(list.get(n));
    return copy(list,n+1); 
}

除非这不起作用。有什么建议或提示吗?

【问题讨论】:

  • 那里有什么错误?
  • “不起作用”以什么方式?描述您寻求帮助的具体问题
  • 这个递归有基本情况吗?还是它只是永远自称?
  • 正要说同样的话。没有基本情况,看不到这会终止。

标签: java list recursion arraylist


【解决方案1】:

问题是您在每次递归中都创建了一个新的ArrayList。而且你不会在任何地方归还它。

你应该做的是,在辅助方法中,也将目标ArrayList作为参数传递,并添加到它而不是新的。

(当然,完成后不要忘记返回)。

【讨论】:

    【解决方案2】:

    您在每个递归调用中分配 (ArrayList um=new ArrayList();) 数组列表。 我也看不到递归函数何时停止调用自己

    【讨论】:

      【解决方案3】:

      请参阅下面的基本递归斐波那契函数:

      public int fib(int n) {
          if(n <= 1) {
              return n;
          } else {
              return fib(n - 1) + fib(n - 2);
          }
      }
      

      这是一个递归函数,因为它有一个基本情况,即函数返回结果的路径,该结果不是对自身的另一个调用。您需要一个基本案例来在满足条件时完成递归调用并返回结果。

      【讨论】:

        【解决方案4】:

        试试这个:

        private void copy(ArrayList<T> src, ArrayList<T> src_copy, int n) {
          if (n>=0){
            src_copy.add(src.get(n));
            copy(src,src_copy, n-1); 
           }
         }
        

        然后,如下使用它:

        ArrayList<T> src = ... ; //your arrayList
        ArrayList<T> src_copy = new ArrayList<T>();
        if (src != null && src.size() > 0) {
           copy(src, src_copy, src.size()-1);
         }
        

        【讨论】:

          【解决方案5】:

          我不知道你遇到了什么错误。但我认为这应该可行。

          public ArrayList<T> copy(ArrayList<T> arrlist) {
              ArrayList<T> um = new ArrayList<T>();
              return copy(arrlist, um, 0); 
          }
          
          private ArrayList<T> copy(ArrayList<T> arrlist, ArrayList<T> um, int n) {
              if (n < arrlist.size())
                  um.add(arrlist.get(n));
              else
                  return um;
              return copy(arrlist, um, n+1); 
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-03-18
            • 2021-03-20
            • 2021-12-09
            • 2021-07-23
            • 2015-04-24
            • 1970-01-01
            • 2011-05-24
            • 2019-09-06
            相关资源
            最近更新 更多