Помогите с рекурсией, пожалуйста
Помогите пожалуйста. Задание таково:В массиве X(N) после каждого положительного элемента
вставить 0. Найти среднее арифметическое после вставки.
При запуске программа иногда срабатывает, а иногда пишет что "Индекс находится вне границ массива" с указанием на эту строчку arr_r[i + shift] = arr[i]; в функции с рекурсией. Полагаю что-то с размерами, а что именно не пойму.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace lab72cs_rec
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
static double[] arr_r;
private void button1_Click(object sender, EventArgs e)
{
Int32 n;
if (textBox1.Text != "")
{
clear();
n = Convert.ToInt32(textBox1.Text);
double[] arr = get_array(n);
int k = arr.Count(x => x > 0);
arr_r = new double[n + k];
del(dataGridView1, arr);
del(dataGridView2, process_array(arr));
process_array_recurse(arr);
del(dataGridView3, arr_r);
}
else
{
MessageBox.Show("Введите число");
}
}
private void clear()
{
dataGridView1.Rows.Clear();
dataGridView2.Rows.Clear();
}
private void process_array_recurse(double[] arr, int i = 0, int shift = 0)
{
if (i < arr.Length)
{
arr_r[i + shift] = arr[i];
if (arr[i]>0)
{
shift++;
arr_r[i + shift] = 0;
}
process_array_recurse(arr, i+1, shift);
}
else
{
return;
}
// p2 = averege(arr, arr.Length + shift);
// listBox1.Items.Add("Среднее арифметическое после вставки");
// listBox1.Items.Add(Convert.ToString(p2));
}
double averege(double[] arr, int size)
{
double result = 0.0;
for (int i = 0; i < arr.Length; i++)
{
result = result + (arr[i]);
}
result = result / (arr.Length);
return result;
}
private double[] process_array(double[] arr)
{
int n = arr.Count(x => x > 0);
double[] result = new double[arr.Length + n];
int shift = 0;
for (int i = 0; i < arr.Length; i++)
{
result[i + shift] = arr[i];
if (arr[i]>0)
{
shift++;
result[i + shift] = 0;
}
}
return result;
}
static void del(DataGridView dataGridView, double[] arr)
{
DataGridViewRow row = new DataGridViewRow();
dataGridView.ColumnCount = arr.Length;
for (int i = 0; i < arr.Length; i++)
{
row.Cells.Add(new DataGridViewTextBoxCell { Value = arr[i].ToString() });
}
dataGridView.Rows.Add(row);
}
static double[] get_array(Int32 size)
{
double[] result = new double[size];
Random rnd = new Random();
for (int i = 0; i < size; i++)
{
result[i] = rnd.Next(-100, 100);
}
return result;
}
private void button1_Click_1(object sender, EventArgs e)
{
Int32 n;
if (textBox1.Text != "")
{
clear();
n = Convert.ToInt32(textBox1.Text);
double[] arr = get_array(n);
arr_r = new double[n + n / 4];
del(dataGridView1, arr);
del(dataGridView2, process_array(arr));
process_array_recurse(arr);
del(dataGridView3, arr_r);
}
else
{
MessageBox.Show("Введите целое число");
}
}
}
}
Ответы (1 шт):
Автор решения: Neomaster
→ Ссылка
int[] input = { 1, 2, -1, -2, -3, 6, 8, -1, 5, -9 };
List<int> output = new List<int>();
foreach (int x in input)
{
output.Add(x);
if (x >= 0) output.Add(0);
}
double average = output.Average();
// Проверка полученного массива.
foreach (int i in output)
{
Console.Write(i + " ");
}
// 1 0 2 0 -1 -2 -3 6 0 8 0 -1 5 0 -9
Console.ReadKey();
P.S.
Решение с учетом поправки автора в комментариях. Без LINQ, т.к. автор не знаком с ним.