Помогите с рекурсией, пожалуйста

Помогите пожалуйста. Задание таково:В массиве 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, т.к. автор не знаком с ним.

→ Ссылка