2016-06-09 4 views
0

Я изучаю рекурсию. Я знаю основы и понимаю, как это работает, но я столкнулся с проблемой. Я написал код, чтобы найти позицию значения мин в массиве с помощью рекурсии, которая:Использование рекурсии для определения положения минимального значения

public static int findMinPosition(int[] list, int position) 
{ 
    int minPosition = 0; 
    if(position == list.length) 
    { 

    } 

    else if(position != list.length) 
    { 
    minPosition = findMinPosition(list, position+1); 
    if(list[position] < list[minPosition]) 
    { 

     return minPosition = position; 
    } 

    } 
    return minPosition; 
} 

Это отлично работает, но им не уверен, как это сделать. Я все понимаю, кроме minPosition = findMinPosition(list, position+1);. Я думал, что это просто даст возвращаемое значение из метода, поэтому я изначально также называл этот метод, так как это точка рекурсии. Но мне кажется, что мне нужна эта строка кода ... так minPosition = findMinPosition(list, position+1); вызов метода?

Извините за грубое объяснение и любой помощи полезен

+0

то, что у вас есть, написано в замешательстве. не используйте локальные переменные. передавать все состояния через вызовы параметров. Лучшим советом было бы получить копию Little Schemer и прочитать ее. –

ответ

0

Да, эта строка вызывает метод. На словах это говорит: «Дайте мне положение минимума из отдыха списка». Следующая строка сравнивает первое значение с этим минимальным значением и передает индекс меньшего элемента обратно вызывающему абоненту.

Вы можете сократить это немного путем удаления структурных наворотов:

public static int findMinPosition(int[] list, int position) 
    { 
    if (position == list.length) 
     return 0 

    else 
    { 
     int minPosition = findMinPosition(list, position+1); 
     return list[position] < list[minPosition] ? position : minPosition 
    } 

Вы могли бы уменьшить это далее, просто передав оставшийся список на каждую рекурсию, а не исходный список и индекс. Я оставлю это как упражнение для ученика.

+0

А, спасибо большое, это имеет больше смысла. Итак, в основном, если вы используете переменную для получения значения метода, она дает эту переменную значение, но также создаст еще одну итерацию метода? –

+0

Создание другой итерации зависит от вызова (вызов функции); независимо от того, назначена ли она переменной или нет, является независимой операцией. – Prune