В строке определения переменной 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 будет выдавать такие числа, это никак не предугадать/исправить. Поэтому рекурсию, зависящую от рандома, не стоит делать.
Как вам уже подсказали, использовать рекурсию здесь, мягко говоря, плохо. Все данные уже сгенерированы, вопрос только в том, какое число их них больше, почему бы просто их не поменять местами, чем заново генерировать значения?
Виртуальный выделенный сервер (VDS) становится отличным выбором
Метод обрабатывает нажатие клавишы на клавиатуре (глобальный хук) и скрывает элементы на экранеОднако почему-то после активации if(!SomeOpened)...
Cбой во время установки НЛог там говориться что оно уже установлено но как можно включить это в референсес в Visual Studio 2012 Идет попытка разрешить...
Нужно производить простые арифметические действия над большими числами на C#Использовал библиотеку System
Пытаюсь победить ошибку уже 4 день, уже весь интернет облазил, пересмотрел много решений, но так и не приблизился к решению проблемы :(