2013-04-14 5 views
0

Я запустил этот код на C и на Java, и я получил 65 и 55 соответственно. Я не могу понять, как C может получить 65. Пожалуйста, помогите.Ошибочная рекурсия в C

int recur(int count) 
{ 
    if(count==10) 
     return count; 
    else 
     return (count+recur(++count)); 
} 

void main() 
{ 
    printf("%d\n",recur(0)); 
} 
+3

Смените '++ count' на' count + 1'. Преинкремент увеличивает значение 'count' до того, как он будет использоваться в этой строке. – Paulpro

+0

О, неудивительно. Благодаря! Я пытался понять рекурсию и скопировал этот код из другого вопроса о SOF, который использовал операции инкремента. – xecutioner

+0

ну тогда отредактируйте свой вопрос ... –

ответ

1
return (count+recur(++count)); 

Является Undefined Behaviour. В разных компиляторах у вас могут быть разные результаты, даже один и тот же компилятор с разными параметрами компиляции может привести к разным результатам.

+0

Это все еще не помогает OP _fix_ проблеме. –

+0

@ColeJohnson: Как сказал Paulpro в комментарии к вопросу, если я изменил (число ++) на (count + 1), код будет работать правильно. – xecutioner

+0

Он все равно должен быть частью ответа. Ответ должен быть завершен. Комментарии не gaurenteed, чтобы остаться навсегда. –

1

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

int recur(int count) 
{ 
    int ret; 
    if(count==10) 
     ret = count; 
    else { 
     printf("Count Before = %d\n", count); 
     ret = (count +recur(++count)); 
    } 
    printf("Count after = %d\n", ret); 
    return ret; 
} 

void main() 
{ 
    printf("%d\n",recur(0)); 
} 

Бег дает это

Count Before = 0 
Count Before = 1 
Count Before = 2 
Count Before = 3 
Count Before = 4 
Count Before = 5 
Count Before = 6 
Count Before = 7 
Count Before = 8 
Count Before = 9 
Count after = 10 
Count after = 20 
Count after = 29 
Count after = 37 
Count after = 44 
Count after = 50 
Count after = 55 
Count after = 59 
Count after = 62 
Count after = 64 
Count after = 65 
65 

Таким образом, вы можете увидеть, что рекурсию до 10 первых, затем добавить 10, затем 9, то 8 и т.д. ...

Изменение его я = (количество + повторялись (кол + 1))

дает

Count Before = 0 
Count Before = 1 
Count Before = 2 
Count Before = 3 
Count Before = 4 
Count Before = 5 
Count Before = 6 
Count Before = 7 
Count Before = 8 
Count Before = 9 
Count after = 10 
Count after = 19 
Count after = 27 
Count after = 34 
Count after = 40 
Count after = 45 
Count after = 49 
Count after = 52 
Count after = 54 
Count after = 55 
Count after = 55 
55 

Но теперь 10 уровень вложенности только достиг, но добавленное количество еще на 9

Ie. pre increment означает, что вы добавляете дополнительные 10.

+0

Что это такое: recur (0) = 1 + recur (1) = 1 + 2 + recur (2) = 1 + 2 + 3 + recur (3) ..... = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + recur (10) = 65 Проблема заключается в том, что оператор pre-increment является первым, который будет выполнен в заявлении , поэтому он изменяет возвращаемый оператор возврата на: return ((count + 1) + (recur (count + 1))); Это вызывает неоднозначность, поскольку оператор return добавляет (аргумент + 1) дважды вместо аргумента + (аргумент + 1). Код должен удалить оператор инкремента и изменить его на (count + 1). – xecutioner