C中递归形式的幻方

Magic square in a recursive form in C

我正在研究幻方问题,正方形的大小是 3 到 99 之间的奇数。这是 5x5 正方形的结果:

   15    8    1   24   17

   16   14    7    5   23

   22   20   13    6    4

    3   21   19   12   10

    9    2   25   18   11

该程序使用 for 循环运行良好,但我被要求使用递归重写它。

谁能给我一些指导?非常感谢!

    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            square[i][j] = 0;
        }
    }

    square[i][j] = k;    // Start from the middle of the first row (1)

    for (k = 2; k <= size * size; k++) {
        // Move up and left    

        if (square[I][j]) {
            // Move down if space is occupied
        } 

        square[I][j] = k;
    }

我试图以递归方式重写它,但出现“分段错误:11”。

void magic(int square[][size], int size, int k, int i, int j) {

    if (k >= size * size) {
        return;
    } else {
        // Move up and left   
        
        if (square[I][j]) {
            // Move down if space is occupied
        } 

        square[I][j] = k;

        magic(square, size, k + 1, i, j);
    }
}

由于构建魔方是自然迭代的,而根本不是自然递归的,我只能假设讲师的objective是在强调一个事实,即任何迭代算法都可以重写为递归算法。 (反之亦然。)那么它是如何工作的呢?

迭代算法具有这种抽象形式:

iterative(initial_index, final_index):    
    i := initial_index
    current_state := initial_state
    loop_top:
    if i > final_index then
        return current_state
    update_state(current_state, i)
    i := i + 1
    go to loop_top

可以这样递归重写(例如):

recursive(initial_index, final_index):
    if initial_index > final_index then
        return initial_state                   // the same initial_state as before
    current_state = recursive(initial_index, final_index - 1)  // recursion
    update_state(current_state, final_index)   // the same update_state() as before
    return current_state

有关如何将您的特定算法映射到该算法或类似算法的详细信息留作练习。

原来我写的递归一直都是正确的,编译错误来自递归函数的二维数组参数,那个二维数组的大小是程序编译后用户动态分配的,在旧的版本我用最大值定义了函数,这就是为什么函数只在大小最大时才起作用的原因。