C语言中递归形式的幻方

C语言中递归形式的幻方,c,recursion,magic-square,C,Recursion,Magic Square,我正在研究一个魔方问题,魔方的大小是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 < siz

我正在研究一个魔方问题,魔方的大小是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;
    }

由于构建幻方是自然迭代的,而不是自然递归的,我只能假设讲师的目标是强调这样一个事实,即任何迭代算法都可以重写为递归算法。(反过来也是如此。)那么这是如何工作的呢

迭代算法具有以下抽象形式:

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
可以像这样递归重写的(例如):


关于如何将特定算法映射到该算法或其他等效算法的详细信息将作为练习保留。

结果证明我编写的递归一直都是正确的,编译错误来自递归函数的2D数组参数,该2D数组的大小是在程序编译后由用户动态分配的,在旧版本中,我使用最大值定义了函数,这就是为什么函数只有在大小最大时才工作。

“我太不好意思发布lol”-在看到残骸之前,我们无法告诉您出了什么问题。不管怎样,我真的不喜欢老师让学生用递归实现一个自然迭代的问题。他们基本上是强迫你做一些比你已经做的更糟糕的事情。如果他们想教递归,那很好,但他们应该努力想出一个真正的例子,从递归中受益。在这种情况下,也许他们真的有一些解决方案,通过使用递归来简化,但我不知道它是什么。你想递归地找到幻方的所有解决方案吗,或者只是从最上面一行的中间开始,对角线上的数字在增加?@pmg只是一个数字在增加,直到所有插槽都被填满。它可以从任何地方开始,我只是觉得从中间开始,左上角移动更容易实现。。。假设我们的递归函数是
magic(arr,size,n)。。。我们从
magic(arr,25,1)
开始。。。它将
1
放置到位,并使用
magic(arr,25,2)
递归。。。它将
2
放在适当的位置,并与3一起递归。。。puts
3
n+1一起递归。。。直到
n
为25。
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