2014-01-09 4 views
-4

эй может кто-нибудь сказать мне, как эта функция работает?!Объяснение этой рекурсивной функции

для функции и ничтожной функции:

int countoccu(int array[],int value,int lower,int upper) 
{ 
    int counter=0; 
    if(lower==upper) 
     if (array[lower]==value) 
      return 1; 
     else 
      return 0; 
    else 
     counter = counter + countoccu(array, value, lower+1, upper); 

    if (array[lower]==value) 
     counter++; 
    return counter; 
}; 

может кто-нибудь объяснить это для меня

выход будет 3

void main() 
{ 
    int array[5]={3,7,3,3,11}; 
    cout << countoccu(array,3,0,4) << endl; 
} 
+0

Это вопрос домашнего задания? Если да, пожалуйста, предоставьте дополнительные сведения о том, что вы думаете до сих пор (см. Http://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions для руководства) – SirRichie

+2

'};' <- это не javascript ... также 'main' должно иметь возвращаемое значение, поэтому оно не может быть недействительным. – deW1

+1

Чтобы уточнить, что сказал @dan, 'void main()' является [незаконным] (http://stackoverflow.com/a/2080996/1227469) и приводит к неопределенному поведению. Вместо этого используйте 'int main()' и (необязательно) 'return 0;' в конце функции, чтобы указать успешное завершение работы программы. Это нормально опустить оператор 'return', и в этом случае он будет возвращать 0 по умолчанию. – JBentley

ответ

2

Это очень глупый способ подсчитать количество value вхождений , для заданного array, в заданном диапазоне [upper, lower], с использованием повторения.

(если я понял, что это хорошо.)

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

+0

Я думаю, верхний элемент подсчитывается дважды – dousin

+0

IMO работает правильно, это глупо, потому что он использует рекурсию для итеративной задачи и делает ее едва понятной. Я не большой поклонник создания 'fun (n) {/ * stuff */return fun (n + 1);}'. Он даже не использует стек для чего-либо, кроме переменной, которая может быть только увеличена или нет. – luk32

1
int countoccu(int array[],int value,int lower,int upper){ 

int counter=0; 

// Check if the end of the array is reached 
if(lower==upper) 

    // Is the last element the "value" we are looking for? 
    if (array[lower]==value) 
     // Yes, so count it 
     return 1; 
    // No, don't count it 
    else return 0; 

// Not the end of the array 
else 
    // Move the position to the next item in the array and count it and all the following values that equals "value" 
    counter=counter+countoccu(array,value,lower+1,upper); 

// Is the current item equal to the value being counted? 
if (array[lower]==value) 
    // Yes, so count it 
    counter++; 

return counter; 

In your example you will get these calls: 
countoccu(array,3,0,4) = 1+0+1+1+0 = 3 
    countoccu(array,3,1,4) = 0+1+1+0 = 2 
    countoccu(array,3,2,4) = 1+1+0 = 2 
     countoccu(array,3,3,4) = 1+0 = 1 
     countoccu(array,3,4,4) = 0 = 0 
0

Хотя функция написана плохо, ее принцип работы прост. Он проверяет, равен ли элемент с более низким индексом заданное значение. Если это так, он увеличивает счетчик и добавляет счетчик для массива, начиная со следующего индекса после того, как индекс ниже, который меньше + 1 (на самом деле вызывает себя в это время с более низким + 1).

Я хотел бы переписать функцию следующим образом

/* constexpr */ size_t count(const int a[], size_t n, int value) 
{ 
    return (n == 0 ? 0 : ((a[0] == value) + count(a + 1, n - 1, value))); 
} 

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

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