2016-02-29 62 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); 
     } 
    } 

我有一些怀疑有这种类型的返回语句的相关递归程序。任何人都可以用适当的方式解释我。 我不能理解那件事,如果我写的时候返回0当n == 0那么它为什么从else返回值。为什么答案不是0.我很困惑,在return语句中。
Plz帮助我。 提前感谢您。添加数字使用递归在C

+2

首先被解雇了,你说的C,那你说C++。并且不要告诉我你正在以这种方式实际地格式化你的代码? –

+0

你为什么要用递归函数呢? –

+0

_“我不能理解那件事,如果我写的时候返回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

真的很有用,我明白这件事,但我NIT得到那个地方将返回值.. –

+0

如果(N == 0)返回0将其返回到主()... –

+0

@KeyurShah了解如何使用调试器(无论如何迟早都需要执行)并逐行执行代码,逐步进入递归调用。查看代码的位置,查看'n'变化的值,查看返回值。它应该有希望的帮助。 –