关于递归函数怎么看他什么时候结束

递归函数为啥需要返回值,他的返回值有什么要求,怎么写,还有比如下面的代码,怎么看出他是n=1的时候结束的

#include <stdio.h>

int main()

{

    int sub(int n);

    int i=5;

    printf("%d\n",sub(i));

    return 0;

}

int sub(int n)

{

    int a;

    if(n==1) return 1;

    a=n+sub(n-1);     //递归调用

    return(a);

}

if(n==1) return 1;

return 最后一个函数的返回,然后依次倒数第二个,倒数第三个......第二个,第一个,结束