Обратный метод для массива int - PullRequest
2 голосов
/ 10 ноября 2008

У меня это как Main

int[] M ={ 10, 2, 30, 4, 50, 6, 7, 80 };

MyMath.Reverse(M);

for (int i = 0; i < M.Length; i++)

    Console.WriteLine(M[i].ToString() + ", ");

После того, как я создал класс MyMath, я создал метод Reverse

public int Reverse(Array M)
 {
     int len = M.Length;
       for (int i = 0; i < len / 2; i++) 
       {
           int temp = M[i]; M[i] = M[len - i - 1]; M[len - i - 1] = temp;

       }           
 }

но я уверен, что это неправильно, потому что он не работает :-), так у вас есть другой код для записи в обратном методе?

примечание: я не хочу использовать встроенный метод Reverse в классе Array


да, ребята, когда я использовал встроенный обратный метод, я получил эту ошибку

Процесс завершен из-за StackOverflowException.

вот после того, как я написал метод как

public static int Reverse(Array M)
{
    return Reverse(M);
}

Итак, я попытался создать свой собственный обратный метод, и там я застрял

Ответы [ 4 ]

4 голосов
/ 11 ноября 2008

Работа от вашего

public static int Reverse(Array M)
{
    return Reverse(M);
}

У вас 2 проблемы.

  1. Функция Reverse (M) похожа на ту же функцию, что и вы, поэтому вы вызываете новую функцию, которая сама вызывает, которая вызывает себя и т. Д., Что приводит к переполнению стека. Изменить на return Array.Reverse(M);
  2. Array.Reverse возвращает пустоту, поэтому, если вам нужно вернуть int (не уверен, что это должно быть здесь), вам нужно будет предоставить свой собственный. Или измените вашу Reverse функцию на void.
2 голосов
/ 11 ноября 2008

Чтобы исправить вашу проблему, измените ваш метод на:

// the built-in returns void, so that needed to be changed...
public static void Reverse(Array M)
{
    Array.Reverse(M); // you forgot to reference the Array class in yours
}

Нет проблем с переполнением стека.

0 голосов
/ 10 ноября 2008

Нет смысла не использовать Array.Reverse. Но если вы действительно хотите это сделать, ОДИН вариант может заключаться в дублировании массива в стек, хотя я не верю, что это очень быстро (но я также не профилировал его):

private void Whatever()
{
    int[] M = { 10, 2, 30, 4, 50, 6, 7, 80 };
    ReverseArray(ref M);

}

private void ReverseArray(ref int[] input)
{
    Stack<int> tmp = new Stack<int>();
    foreach (int i in input)
    {
        tmp.Push(i);
    }
    input = tmp.ToArray();
}
0 голосов
/ 10 ноября 2008

Вам нужно передать массив в качестве ссылки. В C # вы делаете это с помощью ключевого слова ref при объявлении ваших параметров.

То, что вы сейчас делаете, - это в основном обращение к копии массива, которая никогда не передается вызывающей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...