2010-12-09 2 views
0
colour[5]={0}; 

void _do() 
{ 
    colour[i]=1; 
    for(int i=0;i<5;i++){ 
    _do(i); 
    } 
} 

Мои вопросы, в то время как последняя рекурсия завершена, мы начнем наше путешествие, чтобы перейти от последнего к первому. Что мы увидим, когда вернемся к провидному звонку? Устанавливаем ли мы все цвета в 1? или мы wud получаем оставшиеся 0, которые не вызывали эту функцию.Концепция рекурсии

Вопрос: если мы обновим массив в вызове, получим ли мы это обновление при возврате назад к предыдущему вызову? Или мы получим предыдущую версию этого массива?

Заранее спасибо.

+0

Это недопустимый C++, или нам не хватает кода, чтобы рассказать вам об этом. – Thanatos 2010-12-09 04:53:43

ответ

0

Если массив определен вне рекурсивного метода, он будет изменяться при выполнении рекурсии. Если он определен в шаге рекурсии (внутри метода) и не возвращается, изменения никогда не произойдут.

2

Во-первых, код не будет компилироваться - в строке 5 вы ссылаетесь на «i», не объявляя его (что происходит в строке 6).

Даже если вы его исправили, код будет бесконечно рекурсивно - вы попадете в первую итерацию цикла «за», вызовите _do (1), который затем войдет в цикл «for» и вызовет _do (1) еще раз.

1

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

0

Вы нарушаете базовую концепцию рекурсии здесь - рекурсивно, а не итерации. Это, как вы бы это сделать:

int colour[5]={0}; 

void _do(int i) 
{ 
    if (i < sizeof(colour)) 
    { 
    colour[i]=1; 
    _do(i + 1); 
    } 
} 

В принципе, вы либо итерация, или рекурсию. Какой из них лучше зависит от ситуации, типа структуры данных, того, как другие функции, которые вы используете, ведут себя и т. Д.

В этом конкретном случае я обычно повторял.

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

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