Java 如何在递归中执行一次性操作?

Java 如何在递归中执行一次性操作?,java,arrays,recursion,insert,element,Java,Arrays,Recursion,Insert,Element,我想递归地将一个元素插入到已经排序的数组中,在移动中打印出所需的输出。以下是我目前的代码: static void recursivelyInsertElement(int[] array, int start, int elem) { if (start == array.length) { return; } if (array[start] > elem) { System.out.print(elem + " ");

我想递归地将一个元素插入到已经排序的数组中,在移动中打印出所需的输出。以下是我目前的代码:

static void recursivelyInsertElement(int[] array, int start, int elem) {
    if (start == array.length) {
        return;
    }

    if (array[start] > elem) {
        System.out.print(elem + " ");
    }

    System.out.print(array[start] + " ");
    recursivelyInsertElement(array, start + 1, elem);
}
这里的问题是,一旦它找到要插入的元素的位置,它就不会停止这样做,直到函数结束。我怎样才能让它只添加一次

我想到的是添加一个额外的
boolean
函数参数,默认情况下它是
false
。然后,使第二个
如下图所示:

if (array[start] > elem && !isAdded) {
    System.out.print(elem + " ");
    isAdded = true;
}
这令人惊讶地有效,但非常丑陋。没有其他方法可以做到这一点吗?

那么:

static void recursivelyInsertElement(int[] array, int start, int elem) {
    if (start == array.length) {
        return;
    }

    if (array[start] > elem) {
        System.out.print(elem + " ");
        printArrayAfterIndex(array,start);
    }

    System.out.print(array[start] + " ");
    recursivelyInsertElement(array, start + 1, elem);
}

然后编写一个简单的函数。

尽管它有点难看,但我认为额外的参数是最好的选择。递归函数需要知道它是否需要执行“1次”操作,因此,在我看来,您最好的选择是要么向函数传递布尔值,要么保留一个全局变量(方便,但在某些情况下不受欢迎)


我也喜欢@Eyal的解决方案;我只是在添加一个额外的布尔变量和创建一个完整的额外函数之间左右为难。

如果当前位置是插入元素的正确位置,您可以在每次迭代中找到:

static void recursivelyInsertElement(int[] array, int start, int elem) {
    boolean isBelowCurrent  = start == array.length || elem < array[start];
    boolean isAbovePrevious = start == 0 || elem >= array[start - 1];

    if (isBelowCurrent && isAbovePrevious) {
        System.out.println(elem);
    }

    if (start < array.length) {
        System.out.println(array[start]);
        recursivelyInsertElement(array, start + 1, elem);
    } 
}
static void recursivelyInsertElement(int[]数组,int start,int elem){
布尔值isBelowCurrent=start==array.length | | elem=array[start-1];
如果(isBelowCurrent和isAbovePrevious){
系统输出打印项次(elem);
}
if(开始<数组长度){
System.out.println(数组[start]);
递归插入元素(数组,开始+1,元素);
} 
}

我的数组已排序。因此,我要插入的元素不一定要在它的末尾。对,我首先误解了你,请参阅我的编辑。打印函数的“额外”好处是,当找到元素的位置时,递归停止。因此,它只打开堆栈中的一个帧,然后回滚。如果传递布尔值,则将继续打开帧,直到到达终点。对于大型阵列,您可能还需要向堆栈添加大小。是的,我也喜欢@Eyal的解决方案。尽管最后我可能会使用它,但我注意到
boolean
变量方法的一个缺点是,如果它比其他所有方法都大,它就不会插入元素。它能以某种方式被修复吗(我的意思是仍然使用布尔值)?你肯定想保持IF的顺序;您的第一个IF是确保您留在阵列中。它仍然可以与bool一起工作,但是您必须在IF条件下稍微重新安排您的逻辑。我想得越多,尤其是Eyal提到的堆栈,我就越喜欢他们的解决方案。