2016-07-21 1 views
0

Извините за этот основной вопрос, но он уже занял несколько часов. Выпуск: Чтобы сдвиг вправо массив для определенных шагов Вот код:Рекурсивная функция не остановлена, как ожидалось

static int[] ShiftRight(int[] arr, int shiftTimes) 
    { 
     if (shiftTimes == 0 || arr.Length == 0 || arr.Length == 1) return arr; 

     var resultArray = new int[arr.Length]; 

     for (var i = 1; i < arr.Length; i++) 
      resultArray[i] = arr[i - 1]; 

     resultArray[0] = arr[resultArray.Length - 1]; 

     while (shiftTimes > 1) 
     { 
      shiftTimes--;  
      ShiftRight(resultArray, shiftTimes); 
     }    

     return resultArray; 
    } 

Проблема: Хотя выражение while есть контролировать рекурсию, по неизвестным причинам, после достижения return resultArray; line, программа возвращается к выражению while, чтобы он дал неправильный результат! Такое поведение наблюдается при отладке.

Подпись метода не может быть изменена.

Любая помощь очень ценится.

+2

либо петля, либо рекурсия - выберите один – pm100

+0

Замените while на, если. Возможно, это может сработать. – MyIsaak

+0

@MyIsaak: просто замените, но все равно получите неправильный результат - должно быть еще, где я делаю ошибку! – Ali

ответ

2

Вы пытаетесь использовать цикл, а также рекурсию. Удалите цикл while и просто верните эту функцию с обновленной переменной shiftTimes.

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     int[] arr = ShiftRight(new int[] { 1,2,3,4,5,6,7,8,9,10}, 2); 
     Console.WriteLine(String.Join(",",arr)); 
    } 

    static int[] ShiftRight(int[] arr, int shiftTimes) 
    { 
     if (shiftTimes == 0 || arr.Length == 0 || arr.Length == 1) return arr; 

     var resultArray = new int[arr.Length]; 

     for (var i = 1; i <= arr.Length; i++) 
      resultArray[i%arr.Length] = arr[i - 1]; 

     return ShiftRight(resultArray, --shiftTimes); 
    } 
} 
4

Вам не нужен цикл while. Рекурсия - это все, что вам нужно здесь - она ​​обязательно повторится, а массив будет перенесен до тех пор, пока не будет достигнуто условие остановки (shiftTimes == 0).

Обратите внимание, что переменная shiftTimes, которая уменьшается при рекурсивных вызовах, не отражается в вызывающей среде - аргумент передается по значению, поэтому создается новая копия и уменьшается только копия с каждым новым вызовом ShiftRight.

Вы также ничего не делаете с возвращаемым значением рекурсивного вызова, вы должны его вернуть.

+0

Второй абзац был настолько полезен для меня - спасибо. Что касается первого абзаца, вы имеете в виду, что я должен заменить «while» на «if», и тогда это нормально? хотя я сделал это, все еще получаю неправильный результат - в какой части я ошибаюсь? – Ali

+0

@AliAshoori Вам даже не нужен if, потому что у вас есть предложение stop, когда 'shiftTimes == 0', вы просто возвращаете массив ввода - то же самое. (Добавление if не является неправильным, но оно не требуется). – amit

+0

OMG, вы правы, уже есть предложение остановки в начале. это неутешительный, но все же неправильный результат :-( – Ali