Дана последовательность ненулевых чисел после которой следует 0. Рекурсия
Такая задачка: Дана последовательность ненулевых чисел, за которой следует 0. Напечатать сначала все отрицательные , а затем все положительные числа этой последовательности(в любом порядке). ВАЖНО! Сделать, чтобы код это делал через рекурсивный алгоритм.
В общем и целом я не знаю как правильно задать параметры функции. Чтобы именно эти блоки работали верно
int[] row = { -2, 3, 5, 2, -3, 0 };
bool bPositive = false;
static int Recursion(....)
{
if (row[i])
{
if (bPositive && row[i] < 0)
{
Console.WriteLine(row[i] + " ");
}
if (!bPositive && row[i] > 0)
{
Console.WriteLine(row[i] + " ");
}
Recursion(i + 1, bPositive);
}
}
static int Recursion(....)
{
Recursion(row, 0, true);
Recursion(row, 0, false);
return 0
}
Ответы (3 шт):
по идее алгоритм мог бы быть простым:
пройтись по последовательности до 0 2 раза - первый раз выводить только отрицательные числа, второй - только положительные
но в этом случае не будет рекурсии
в качестве рекурсионного алгоритма можно сделать функцию, которая на вход принимает массив, и позицию в массиве
внутри функция show_negative выбирает значение arr[pos], выводит его для отрицательных чисел и вызывает себя, но с новой позицией show_negative(arr, pos + 1)
если нашла значение 0 - то просто функция прекращает выполнение
тоже самое для положительных чисел - функция show_positive
вот это уже рекурсионный алгоритм
По идее можно совместить обе функции (для отрицательных и положительных чисел в одну) - будем считать, что пока мы идем слева направо, то выводим только отрицательные, а справа налево - положительные
тогда функция будет содержать еще и 3 параметр - isNegative который может быть true или false
если isNegative == true делаем все как функция show_negative, при достижении 0 меняем isNegative = false и делаем все как функция show_positive, при достижении позиции -1 прекращаем выполнять функцию
в результате будет сначала выведен список отрицательных чисел, потом положительных
Вообще, всё гораздо проще же.
Отрицательные выводим сразу, положительные - после погружения в стек.
Вместо псевдокода напишу на js:
function foo(a) {
if (a.length === 0) return;
const num = a[0];
if (num === 0) return;
if (num < 0) console.log(num);
foo(a.slice(1))
if (num > 0) console.log(num);
}
const a = [-2, 3, 5, 2, -3, 0];
foo(a);
Переписал код с советов:
static void Main(string[] args)
{
int[] mass = new int[] { 12, -2, -3, 5, 6, 12, 0 };
print(mass);
Console.ReadKey();
}
static void print(int[] mass, int i = 0)
{
int num = mass[i];
if (num == 0)
{
return;
}
if (num < 0)
Console.Write(num + " ");
print(mass, ++i);
if (num > 0)
Console.Write(num + " ");
}