В строке определения переменной text возникает ошибка StackOverflow
и не знаю как можно избавиться от его потому что условие обязательное.
private string MakeExpresion()
{
Random r = new Random();
char operation = (r.Next(0, 2) == 0) ? '+' : '-';
int num1 = r.Next(1, 51);
int num2 = r.Next(1, 51);
string text = (num1 > num2) ? $"{num1} {operation} {num2}" : MakeExpresion();
return text;
}
Вы же получаете числа случайным образом, верно? Допустим, что вам выпал num1<=num2. Это может случиться? Вполне. Так как класс Random у вас создается при каждом запуске, то, скорее всего, между 2 рекурсивными вызовами проходит мало времени и второй рандом создается с тем же начальным значением, что и первый, и, как следствие, генерирует те же самые случайные числа, что и в прошлый раз. И снова вы входите в рекурсию. Так продолжается, пока не произойдет переполнение стека и программа не упадет.
Без рекурсии
private string MakeExpresion()
{
Random r = new Random();
char operation = (r.Next(0, 2) == 0) ? '+' : '-';
int num1 = r.Next(1, 51);
int num2 = r.Next(1, 51);
while(num2 == num1) num2 = r.Next(1, 51);
if (num1 < num2) {
var tmp = num1;
num1 = num2;
num2 = tmp;
}
string text = $"{num1} {operation} {num2}";
return text;
}
Вся проблема в том, что нельзя создавать объекты класса Random в циклах или рекурсиях. Почему? Потому что для seed`а используются системные часы:
Начальное значение по умолчанию извлекается из системных часов и конечности разрешающей. В результате разные Random объекты, создаваемые в закрытой последовательности путем вызова конструктора по умолчанию будет иметь одинаковые начальное значение по умолчанию и, таким образом, будут производить идентичные наборы случайных чисел.
https://msdn.microsoft.com/ru-ru/library/h343ddh9(v=vs.110).aspx
Если самый первый рандом выдаст числа num1 < num2, seed при следующем создании System.Random вряд ли успеет смениться, а если и успеет, есть вероятность, что Random.Next опять выдаст num1 < num2 и весь цикл повторится.
Если уж и использовать Random, то один на "метод":
private string MakeExpression()
{
Random rnd = new Random();
return MakeExpressionInternal(rnd);
}
private string MakeExpresionInternal(Random rnd)
{
char operation = (rnd.Next(0, 2) == 0) ? '+' : '-';
int num1 = rnd.Next(1, 51);
int num2 = rnd.Next(1, 51);
string text = (num1 > num2) ? $"{num1} {operation} {num2}" : MakeExpresionInternal(rnd);
return text;
}
Скажу сразу - есть вероятность, что Random будет выдавать числа num1 < num2, пока не упадет стэк, тут уже дело в том, что Random будет выдавать такие числа, это никак не предугадать/исправить. Поэтому рекурсию, зависящую от рандома, не стоит делать.
Как вам уже подсказали, использовать рекурсию здесь, мягко говоря, плохо. Все данные уже сгенерированы, вопрос только в том, какое число их них больше, почему бы просто их не поменять местами, чем заново генерировать значения?
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Метод обрабатывает нажатие клавишы на клавиатуре (глобальный хук) и скрывает элементы на экранеОднако почему-то после активации if(!SomeOpened)...
Cбой во время установки НЛог там говориться что оно уже установлено но как можно включить это в референсес в Visual Studio 2012 Идет попытка разрешить...
Нужно производить простые арифметические действия над большими числами на C#Использовал библиотеку System
Пытаюсь победить ошибку уже 4 день, уже весь интернет облазил, пересмотрел много решений, но так и не приблизился к решению проблемы :(