簡體   English   中英

如何在遞歸 function 中找到錯誤?

[英]How do I find errors in a recursive function?

我試圖找到給定二維數組 NxN 的每個可能排列的每列的最大和中的最小值,其中每行中的值可以向左移動。 例如,數組

4 6 
3 7

將有 4 種可能的排列:

4 6   6 4   4 6    6 4
3 7   3 7   7 3    7 3

每個排列的最大和分別是 13、11、11、13。因此最大和中最小的是 11。我寫了一個遞歸 function 應該可以工作,但由於某種原因,它只適用於更小的 arrays比 6x6... 我是編程新手,最近才了解遞歸,任何有關如何遞歸思考和調試代碼的幫助或建議將不勝感激...

對於陣列 4x4

7410 1371 2665 3195
4775 4130 6499 3414
300 2092 4009 7638
5351 210 7225 7207

答案是 18349,我的代碼給了我正確的答案。

但是,對於陣列 6x6

5219 842 7793 2098 5109 2621
1372 3253 3804 5652 810 1620
4894 6792 1784 4335 4772 6656
3203 1070 4716 5335 1157 6855
5529 2767 2205 408 7516 7454
375 7036 2597 5288 937 2893

答案應該是 23733,但我有 24176。這怎么可能?

這是我的代碼:

#include <iostream>
using namespace std;

#define MAX_N 1000

int n, matrix[MAX_N][MAX_N], shift[MAX_N] = {0}, minSum = 100000000;

void possibTree(int position){
    
    //Base case
    if(position == n){
        for (int i = 0; i < n; i++) {
            // Temporary array to store the values in the row that just shifted towards the left
            int temp[MAX_N] = {0};
            for (int j = 0; j < n; j++) {
                if(j - shift[i] < 0)
                    temp[n+(j-shift[i])] = matrix[i][j];
                else
                    temp[j-shift[i]] = matrix[i][j];
            }
            for (int k = 0; k < n; k++)
                matrix[i][k] = temp[k];
        }
        
        int max = 0;
        for (int i = 0; i < n; i++) {
            int temp = 0;
            for (int j = 0; j < n; j++) {
                temp += matrix[j][i];
            }
            if(temp > max)
                max = temp;
        }
        if(minSum > max)
            minSum = max;
        return;
    }
    
    for (int i = 0; i < n; i++) {
        shift[position] = i;
        possibTree(position+1);
    }
    return;
}

int main() {
    while(cin >> n){
        memset(matrix, 0, sizeof(matrix));
        memset(shift, 0, sizeof(shift));
        if(n == -1) // The user enters "-1" to end the loop and terminate the program.
            return 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cin >> matrix[i][j];
            }
        }
        possibTree(0);
        cout << minSum << endl;
        minSum = 100000000;
    }
    return 0;
}


好的,我相信我理解我的錯誤,我必須在每個基本案例結束時將矩陣重置為其原始 state,當矩陣很小時,代碼仍然能夠找到所有可能的最大總和,但是當矩陣得到更大,一些可能性沒有產生。 這是我的代碼:

#include <iostream>
using namespace std;

#define MAX_N 1000

int n, matrix[MAX_N][MAX_N], OrigMatrix[MAX_N][MAX_N], shift[MAX_N] = {0}, minSum = 100000000;

void possibTree(int position){
    
    //Base case
    if(position == n){
        for (int i = 0; i < n; i++) {
            // Temporary array to store the values in the row that just shifted towards the left
            int temp[MAX_N] = {0};
            for (int j = 0; j < n; j++) {
                if(j - shift[i] < 0)
                    temp[n+(j-shift[i])] = matrix[i][j];
                else
                    temp[j-shift[i]] = matrix[i][j];
            }
            for (int k = 0; k < n; k++)
                matrix[i][k] = temp[k];
        }
        
        int max = 0;
        for (int i = 0; i < n; i++) {
            int temp = 0;
            for (int j = 0; j < n; j++) {
                temp += matrix[j][i];
            }
            if(temp > max)
                max = temp;
        }
        if(minSum > max)
            minSum = max;
        //EDITS
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                matrix[i][j] = OrigMatrix[i][j];
            }
        }
        return;
    }
    
    for (int i = 0; i < n; i++) {
        shift[position] = i;
        possibTree(position+1);
    }
    
    return;
}

int main() {
    while(cin >> n){
        memset(matrix, 0, sizeof(matrix));
        memset(shift, 0, sizeof(shift));
        if(n == -1) // The user enters "-1" to end the loop and terminate the program.
            return 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cin >> matrix[i][j];
            }
        }
        //EDITS
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                OrigMatrix[i][j] = matrix[i][j];
            }
        }
        possibTree(0);
        
        cout << minSum << endl;
        minSum = 100000000;
    }
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM