2009-12-18 3 views
1
#include <iostream> 
using namespace std; 

int recursiveMinimum(int [], int n); 

int main() 
{ 
    int theArray[3] = {1,2,3}; 

    cout << recursiveMinimum(theArray, 0); 
    cout << endl; 
    return 0; 
} 


// pass in array and 0 to indicate first element 
// returns smallest number in an array 
int recursiveMinimum (int anArray[], int n) // nth element is smallest element in anArray 
{ 
    while (anArray[n+1] != NULL) 
    { 
     int smallest = n; 
     if (anArray[n+1] <= anArray[n]) 
      smallest = n + 1; 
     //if last element has not been reached 
     return recursiveMinimum(anArray, smallest); 
    } 
} 

Моя функция завершена, но она ничего не возвращает. Я попытался установить базовый регистр, когда достигнут внешний массив. Возвращаемая линия 0 в основном достигнута, поэтому я уверен, что базовый случай в моей функции достигнут.Почему моя функция recursiveMinimum не работает?

Здесь работает функция:

#include <iostream> 
using namespace std; 

int recursiveMinimum(int a[],int min,int index,int size); 

int main() 
{ 
    int a[6] = {8, 2, 55, 3, 11, 9}; 
    cout << recursiveMinimum(a,a[0],1,6) << endl; 
    return 0; 
} 

// pass in the array, the first element, 
// 1 to indicate 2nd element, and the number of elements 
int recursiveMinimum(int a[],int min,int i,int size) 
{ 
    if(i == size) 
     return min; 

    else if(i < size) 
    { 
     if(a[i] < min)  
      recursiveMinimum(a,a[i], i + 1, size); 
     else 
      recursiveMinimum(a,min, i + 1, size);  
    } 

} 

Спасибо всем, кто помог. Из-за ограничений по времени я отправил SOS (Stack Overflow distress Signal), однако в следующий раз я обязательно перейду через отладчик, прежде чем задавать вопрос.

+1

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

+0

вы должны добавить тег 'recursion' на этот вопрос – Hardryv

+0

Спасибо! – Brandon

ответ

3

Вы рекурсии в то время цикла:

в то время как (условие) рекурсивный вызов в то время как (условие) рекурсивный вызов . . .

Вместо того, что вы, вероятно, думали, был

если (условие) рекурсивного вызова рекурсивного вызова рекурсивного вызова

вы видите? Избавьтесь от этого и замените его инструкцией «if».

+2

Условие плохо для начала. 'n + 1' не обязательно является допустимым индексом в массиве. И проверка на 'NULL'? Что это значит? – jason

+0

Я пытался проверить внешний массив, используя NULL. – Brandon

+0

Брэндон, как только у вас есть что-то работающее сознание, публикующее его здесь? Бьюсь об заклад, вы можете получить больше комментариев. Howver, Джейсон прав, что NULL не является хорошим условием для проверки конца массива. Нет никакой гарантии, что NULL будет найден! Люди обычно проходят по размеру массива в функциях C. Хотя вы часто можете делать '/ 0' для строк, я не думаю, что то же самое можно сказать о произвольном массиве. – wheaties

2

У вас должен быть конечный регистр с рекурсивной функцией.

В настоящий момент ваша функция всегда возвращается сама. Это будет повторяться до тех пор, пока стек не закончится. Вам нужно иметь чек, в котором говорится: «Я сделан», который вернет значение, а не результат другого вызова функции.

+0

легко найти «конечные случаи» в рекурсии, поскольку рекурсивные методы заканчиваются данными для работы с – Hardryv

+0

Да, но они должны перестать называть себя! – Skilldrick

1

Потому что ваш цикл while никогда не заканчивается. Почему вы уверены, что anArray[n+1] когда-нибудь будет NULL?

+0

Позвольте мне прямо указать суть. Только строки заканчиваются нулями. Массив, созданный с фигурными фигурными скобками, не будет иметь нулевого символа в конце. Путь вокруг этого состоит в том, чтобы явно положить число в конце, чтобы обозначить конец массива: {1, 2, 3, -1} или передать длину массива в качестве аргумента функции рекурсивной минимальной. – Brian

+0

Хорошо спасибо за подсказку. – Brandon

1

Вы никогда не нарушаете свою рекурсию. На самом деле я удивляюсь, что это компилируется, так как ваша функция даже не имеет определенного возвращаемого значения, если оно достигает конца. Кроме того, использование while кажется ненужным, так как выполнение функции останавливается после возврата в любом случае.

4

Вы прошли через это в отладчике? Это должно стать довольно очевидным, когда вы это сделаете.

+1

Если он возьмет класс, подобный тому, который я использовал для обучения, он не узнал об отладчиках, и у него, вероятно, нет времени, чтобы узнать, как использовать его до того, как задание должно состояться в конце семестра, либо , –

+0

Это может быть так, если он использует Linux/GCC, но, скорее всего, он установил Visual Studio. Что может быть сложнее, чем установить точку останова и нажать F10/F11? Кроме того, установка Visual C++ Express Edition занимает 5 минут? В дополнение к этому, я уверен, что OP может получить полный взлет VS2008 при снижении стоимости обучения в своей школе! Если они действительно используют Linux GCC, для Google требуется около 5 минут простой учебник в Интернете! Просто нет оправданий! – 2009-12-21 21:36:31

1

Вместо

int recursiveMinimum(int array[], int n); 

Я думаю, что recursiveMinimum должен быть определен как

int recursiveMinimum(int array[], int index, int length); 

с намерением, что recursiveMinimum будет возвращать минимальное значение в array между индексами index и length (т.е. min array[i] где i в [index, length)). Конечно, вы хотите определить это рекурсивно.Итак, я хотел бы отметить, что минимальное значение в array между индексами index и length является

min(array[index], recursiveMinimum(array, index + 1, length)); 

Конечно, существуют пограничные случаи (например, когда index = length - 1). В этом случае вы просто вернете array[index] как минимум.

Надеюсь, это поможет. Дайте мне знать, если это не имеет смысла.

1
int recursiveMinimum(int a[],int min,int index,int size) 
{ 
    if(index == size) 
     return min; 

    else if(i < size) 
    { 
     if(a[i] < min)  
      recursiveMinimum(a,a[i],++index,size); 
     else 
      recursiveMinimum(a,min,++index,size);  
    } 

}

int main() 
{ 
    int a[] = {1,2,3,0,-4}; 
    int min = recursiveMinimum(a,a[0],1,5)); 
    return 0; 
} 

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

Я думаю, что поиск минимума более эффективен, прост и прост, используя итерацию, а не рекурсию.

+0

Спасибо, что нашли время, чтобы закодировать это. Я немного изменил его, и он работал как шарм. – Brandon

+0

Брэндон потребовалось всего 45 секунд, чтобы написать его. – Ashish

1

Вы неправильно понимаете точку рекурсивной функции. Если какое-либо условие истинно, вы возвращаете результат вызова рекурсивной функции, иначе вы возвращаете другое значение. Например, здесь является рекурсивное определение функции факториала (например 5!, или "5 факториала", является 5*4*3*2*1, который 125):

int 
factorial (int n) 
{ 
    if (n == 1) 
    return n; 
    return (n * factorial (n - 1)); 
} 

Как это работает:

  • Если n равен 1, затем возвращается 1, так как 1! равен 1.

  • В противном случае возвращается n, умноженное на 1 менее n.

Например, если n равно 5, то возвращаемое значение является результатом выражения 5 * factorial (5 - 1), которая является такой же, как 5 * factorial (4). Конечно, то же самое происходит снова, так как это рекурсивная функция, а 4 - не 1. Таким образом, вы попадаете в 5 * factorial (4), что совпадает с 5 * (4 * factorial (4 - 1)), или 5 * (4 * factorial (3)).

Теперь вы сможете увидеть шаблон и как работает факторная функция. Ваша рекурсивная минимальная функция должна придерживаться одной и той же общей идеи - если что-то истинно (или не верно), верните результат вызова, функция (возможно, с некоторыми дополнительными вещами, такими как значение n внутри факторной функции, необходимо умножить на результат факториальной функции), else возвращает определенное значение и кодирует функцию для правильной обработки. Другими словами, вам необходимо «окончательное» условие выхода, такое как условие n == 1 в факториальной функции выше.

Удачи вам!

Смежные вопросы