首页 > 解决方案 > 在Java中递归地将数组中的对象与另一个对象相乘

问题描述

你好,我正在学习 Java,在完成了一些学习递归的任务之后,我给自己做一些练习来学习它,但现在我正在努力解决一些问题。

所以主要的问题是当数组中的元素是对象时,我不知道如何递归地乘以数组中的每个元素(如果对象在里面,也许最后没有区别)。所以我给自己做的练习是:检查 1 / 3 是否在给定的数组中。如果是,则将该数组中的所有内容乘以 2 / 1。这是分数:

 private int numerator;      // Zaehler
 private int denominator;    // Nenner

        public Fraction ( int num, int denom )
        {
            if ( denom != 0 )
            {
                if ( denom < 0 )
                {
                    numerator = -num;
                    denominator = -denom;
                }
                else
                {
                    numerator = num;
                    denominator = denom;
                }
                reduce();
            }
            else
            {
                // error: division by zero
                throw new IllegalArgumentException();
            }
        }

        public Fraction()
        {
            numerator = 0;
            denominator = 1;
        }

        public Fraction( int num )
        {
            numerator = num;
            denominator = 1;
        }

所以我通过使用 for 循环来完成它:

public static Fraction[] mulWithFor(Fraction[] arr)
        {
            for (int i = 0; i<arr.length; i++)
            {
                arr[i] = arr[i].multiply(new Fraction(2,1));
            }
            return arr;
        }

但这不是我的主要目标,我想递归地这样做,所以这就是我的方法:

public static Fraction[] mulAus(Fraction[] arr, int i)
        {
            if (i>= 0 && i<arr.length)
            {
                rekurMul(arr,i);
                //return mulAus(rekurMul(arr,i-1));
            }
            return arr;
        }

        public static Fraction rekurMul(Fraction[] arr, int i)
        {
            if (i>= 0 && i<arr.length)
            {
                return arr[i].multiply(new Fraction(2,1));
                return arr[i].multiply(new Fraction(2, 1)); // Does Not Work!!!
            }
            throw new IndexOutOfBoundsException();
        }

也许有人可以帮助我!感谢您的关注。

好的感谢@Chaï Sarfati 以及其他试图帮助我的人。我现在知道如何在一个数组中乘以递归的东西!我使用了@Chaï Sarfati 的方法,但为他的“oneThirdIsPresent”写了一个替代方法,这也是一种递归方法:所以现在我的工作代码看起来像这样

 public static Fraction[] mulAus(Fraction[] arr)
        {
            if(contains(arr,arr.length-1,new Fraction(1,3)))
            {
                rekurMul(arr,0);
                return arr;
            }
            throw new IllegalArgumentException("1/3 does not exist in the Input-Array");
        }

        public static void rekurMul(Fraction[] arr, int i)
        {
            if(i == arr.length)
            {
                return ;
            }
            arr[i] = arr[i].multiply(new Fraction(2,1));
            rekurMul(arr,i+1);
        }

检查给定数组中是否存在 1 / 3 的方法。

public static boolean contains(Fraction[] arr, int i, Fraction x)
        {
            if (i>= 0 && i < arr.length)
            {
                if (arr[i].equals(x))
                { return true;}
                else
                { return contains(arr, i-1,x); }
            }
            return false;
        }

我希望其他人可以从代码中学习。也许有更好的解决方案,但我刚刚开始编程,所以我现在不知道它们。再见

标签: javaarraysobjectrecursion

解决方案


假设您有一个可以在您的班级multiplyBy(Fraction f)中正常工作的方法。Fraction此外,以迭代方式进行会更好(更具可读性,节省更多时间和空间复杂度)。为了这个例子,我会这样做:

首先定义:

private static boolean oneThirdIsPresent(Fraction[] arr){
    for (int i = 0; i < arr.length; i++) {
        if(arr[i].numerator == 1 && arr[i].denominator == 3) {
            return true;
        }
    }
    return false;
}

private static void recursivelyMultBy2(Fraction[] arr, int index){
    if(index == arr.length){
        return;
    }
    arr[index] = arr[index].multiplyBy(new Fraction(2));
    recursivelyMultBy2(arr, index+1);
}

为了最终解决:

public static void multBy2IfOneThirdIsPresent(Fraction[] arr){
    if(oneThirdIsPresent(arr)){
        recursivelyMultBy2(arr, 0);
    }else{
        return;
    }
}

推荐阅读