使用C ++中的递归填充D2数组,有时可以正常工作,抛出其他异常

时间:2018-05-04 19:47:21

标签: c++ arrays recursion

这段代码是一个更大的项目的一部分,但我试图让这一点先工作,因为之后的一切都是微不足道的。基本上我正在尝试使用递归来填充大小为12 x 6的2D数组,其中包含1-12的随机数。诀窍是,数字不能在列或行中重复。代码适用于更大的数字池或更小的数组,但是当我使用这些条件运行它时,它会抛出异常大约一半的时间。我很确定它遇到了无法找到符合条件的数字的情况,所以它只是无限循环,但我不知道如何防止它。

抛出异常的一个例子 -

  

测试中0x01232479处的未处理异常 - 填充数组Recursively.exe:> 0xC00000FD:堆栈溢出(参数:0x00000001,0x00602FE0)。

     

测试中的0x0FF0DB39(ucrtbased.dll)抛出异常 - 填充数组> Recursively.exe:0xC0000005:访问冲突写入位置0x00600FFC。

以下是代码:

#include<iostream>
#include <ctime>  
#include <cstdlib>
using namespace std;

const int X = 12;
const int Y = 6;

//recursion function prototype
int randomArrayFunction(int Array[X][Y], int posParX, int PosParY);

int main() {
    //declarations

    int randomArray[X][Y];
    int posX = 0;
    int posY = 0;
    srand(static_cast<unsigned int>(time(NULL)));

    randomArrayFunction(randomArray, posX, posY);

        for (int i = 0; i < X; i++) {
            for (int j = 0; j < Y; j++) {
                cout << "  " << randomArray[i][j];
            }
            cout << endl;
        }


}

//recursion function defintion
int randomArrayFunction(int Array[X][Y], int posParX, int posParY) {
    int prevPosX = posParX - 1;
    int prevPosY = posParY - 1;
    int randomNumber = rand() % 12;

    if (posParY == Y)
        return 0;

    Array[posParX][posParY] = randomNumber;

    //Checks all previous numbers in a row for duplicates and reassigns a random number if one is found
    while (prevPosX >= 0) {
        if (posParX != 0 && Array[posParX][posParY] == Array[prevPosX][posParY]) {
            Array[posParX][posParY] = randomNumber;
            return randomArrayFunction(Array, posParX, posParY);
        }
        prevPosX--;
    }

    //Checks all previous numbers in a column for duplicates and reassigns a random number if one is found
    while (prevPosY >= 0) {
        if (posParY != 0 && Array[posParX][posParY] == Array[posParX][prevPosY]) {
            Array[posParX][posParY] = randomNumber;
            return randomArrayFunction(Array, posParX, posParY);
        }
        prevPosY--;
    }
    posParX++;

    if (posParX == X) {
        posParY++;
        posParX = 0;
    }

    return randomArrayFunction(Array, posParX, posParY);
}

我还是比较陌生的编码,并且没有太多的递归经验,所以任何人都可以提供的帮助将非常感激。

1 个答案:

答案 0 :(得分:0)

您遇到的问题是,有时您会用完数字来填充数组中的后续条目。为了获得足够的数量,您至少需要(X + Y - 1)个数字。这是因为在填写最后一个条目时,行中已有X - 1个数字,并且该列中可能使用Y - 1个不同的数字。由于您已经使用了X - 1 + Y - 1个数字,因此您需要多一个来填充数组。

使用循环而不是递归可以更好地解决此问题。我不会理解为什么现在使用rand()不是一个好主意。