2013-06-25 2 views
4
int reverse(int); 
void main() 
{ 
    int no =5; 
    reverse(no); 
} 

int reverse(int no) 
{ 

if(no == 0) 
     return 0; 
else 
printf("%d",no); 

reverse(no--); 
} 

Эта программа проходит в бесконечном цикле. Почему это так? Я не могу получить желаемый вывод. Желаемый выход должен быть 5 4 3 2 1. Заранее благодаренПочему эта рекурсивная функция работает бесконечно, а не наоборот?

+1

Кстати, это должно быть 'int main()'. 'void main' не переносится и не работает на всех компиляторах. – hugomg

+0

Отладчик может пригодиться в такие моменты ... – antak

ответ

3

Вы используете пост-декремент оператора на no. Сначала он получает значение no и использует это как значение выражения и , затем декрементами no (все еще используя недооцененное значение как значение выражения). Вы, вероятно, хотите использовать --no или даже просто no - 1. (Первый из них будет изменять no, в то время как последний не будет, но это не имеет значения, потому что no не ссылается после этой точки.)

+2

Я бы настоятельно рекомендовал не использовать декремент вообще - 'no' никогда не читается снова, а использование декремента, вероятно, предполагает, что OP неправильно понимает, как« нет »- это другое переменная в каждом вызове функции. – templatetypedef

+0

Спасибо, я прояснил свои сомнения. – user1208523

12

В этом рекурсивном вызове:

reverse(no--); 

Вы передаете значение от no--. Так как это использует постфикс-оператор, это означает «декремент », затем передать оригинал значение no в рекурсивный звонок reverse. " Это приводит к бесконечной рекурсии, поскольку вы постоянно делаете рекурсивный вызов с reverse, установленным на то же значение.

Чтобы это исправить, изменить, чтобы читать

reverse(no - 1); 

Обратите внимание, что нет никаких оснований для уменьшения no здесь, так как в пределах текущего рекурсивного вызова вы никогда не будете снова читать no. Вы можете просто передать значение no - 1 в функцию. На самом деле, возможно, вы захотите вообще отказаться от использования -- в рекурсивных вызовах, поскольку он почти всегда указывает на ошибку в коде.

Надеюсь, это поможет!

+0

Спасибо, я прояснил свои сомнения. – user1208523

0

Изменение:

reverse(no--); 

к:

reverse(no-1); 

no-- возвращает исходное значение до возникновения декремент. Так что эта строка всегда будет звонить reverse(5). Следовательно, бесконечный цикл.

0

n-- - это приращение, которое сначала использует n в качестве аргумента функции, а затем уменьшает n.

Так n-- по существу делает

reverse(n); 
n = n - 1; 

Что вы хотите --n

0

Вы используете постдекремента. Сначала оценивает, а затем уменьшает значение.

Изменить это:

reverse(no--); 

к этому:

return reverse(--no); 

--no является предекремент. Сначала уменьшите «нет», затем передайте значение, чтобы изменить его.

Обратите внимание, что я возвращаю значение результата, вы всегда должны возвращать int из-за его объявления.

0

Вы хотите сделать

int reverse(int); 
int main() 
{ 
    int no =5; 
    reverse(no); 
} 

int reverse(int no) 
{ 
    if(no == 0) 
     return 0; 
    else 
     printf("%d",no); 
    return reverse(--no); 
} 

Так что вы возвращающим номер каждый раз, когда вы вызываете обратные и вы декремент не прежде чем использовать его.