如何在递归中做一次性的事情?

How to do a one-time thing in a recursion?

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

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 像这样:

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 次”的事情,所以在我看来,最好的选择是将 bool 传递给函数或保留一个全局变量(方便但在某些圈子里不受欢迎)。

我也喜欢@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);
    } 
}