2016-02-29 9 views
-3
#include<stdio.h> 
    #include<conio.h> 

    int add(int n); 

    void main() 
    { 
     int n, ans; 
     clrscr(); 
     printf("Enter Number:"); 
     scanf("%d", &n); 
     ans = add(n); 
     printf("%d", ans); 
     getch(); 
    } 

    int add(int n) 
    {  
     if (n==0) 
     { 
     return 0; 
     } else { 
     return n + add(n-1); 
     } 
    } 

У меня есть некоторые рекурсивные программы, связанные с сомнениями, которые имеют такие операторы возврата. Может ли кто-нибудь объяснить мне это надлежащим образом. Я не могу понять эту вещь, если я пишу return 0, когда n == 0, то почему он возвращает значение из else.Why ответ не является 0. Я запутался в операторе return.
Plz помогите мне. Спасибо, что заранее.Добавление чисел с использованием рекурсии В C

+2

Сначала вы говорите, C, то вы говорите, C++. И не говорите мне, что вы _actually_ форматируете свой код таким образом? –

+0

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

+0

_ «Я не могу понять эту вещь, если я пишу return 0, когда n == 0» _ Ну, рекурсия должна остановиться в какой-то момент, нет? –

ответ

3

Рассмотрим простой пример: add(2).

В этом первом вызове мы идем к else ветви (потому что n не равен нулю) и сделать return 2 + add(2 - 1) (т.е. return 2 + add(1)).

Это приводит ко второму звонку, который также переходит в ветвь else и делает return 1 + add(1 - 1) (то есть return 1 + add(0)).

Это приводит к вызову, в котором n равен нулю, и поэтому мы возвращаем ноль.

Это возвращает к части return 1 + add(1 - 1), которая равна return 1 + 0, поэтому верните это.

Это возвращает к части return 2 + add(2 - 1), которая теперь равна return 2 + 1.

И это возвращает нас к первоначальному вызову, давая результат 3.


Это может быть уложен в дереве что-то вроде

add(2) -> return 2 + add(2 - 1) 
    add(1) -> return 1 + add(1 - 1) 
    add(0) -> return 0 
    add(1) -> return 1 + 0 
add(2) -> return 2 + 1 
+0

Я понял эту вещь, но я не понимаю, откуда она вернет значение. –

+0

if (n == 0) return 0 Вернется ли она к main() ????? –

+0

@KeyurShah Узнайте, как использовать отладчик (вам нужно сделать это рано или поздно в любом случае) и пройдите через код по строкам, вступая в рекурсивные вызовы. Посмотрите, куда идет код, см. Значения изменения 'n', см. Возвращаемые значения. Он, надеюсь, поможет. –

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