那个递归函数到底咋样运行的?
递归函数就是将在自己方法本身调用自身,可以举个生活中的小例子
例如某天,一个老师让他拿着一堆数字开片,他给自己的学生每个人一张,,老师只要求大于等于0的人来按顺序排队,他将一个50给了第一个人,然后要求比他小10的人站出来,之后要求比前一个(就是50-10,拿到40的人)小10的人站出来,然后再出来一个比上一个小10的人出来,以此类推,直到有拿到了0的站出来,那么这一队当中就有了
50,40,30,20,10,0这几数字的持有者,老师要求大于等于0的人就是这个递归的结束语句,因为只要求大于等于0的,最后一个是0,比他小10的人肯定不大于他,所以递归结束
int getSum(int n); //定义方法 int main() //主函数,程序入口 { int i = getSum(50); //定义一个变量用于接收getNum方法的返回值 printf("这几个人手中的卡片总和为%d\n",i); } int getSum(int n) //刚刚定义了getSum方法,这里是具体实行 { //这两个方法中的 i 都是在方法中定义,为局部变量,所以互不干扰 if(n > 0) { int i = getSum(n-10) + n; //以下进行详细解析,解析代码不符合标准写法,只是形式相同 return i; } return 0;//在n的值小于0以前不执行这个 }
这个代码它的实际流程是这样,主函数还是上面那个,不写了
int getSum(int n) //主函数调用时传入实参给此形参,实参值为50,所以这个形参也就是50 { // 1 刚刚调用了本方法,并且传入了40,往下执行 // 2 刚刚调用了本方法,并且传入了30,往下执行 // 3 刚刚调用了本方法,并且传入了20,往下执行 // 4 刚刚调用了本方法,并且传入了10,往下执行 // 5 刚刚调用了本方法,并且传入了0,往下执行 if(n > 0) //步骤 5 的值是 0 ,一个数是不大于自身的,所以 0 不大于 0,不满足,if当中的不执行 { int i = getSum(n - 10) + n; //此处传入n - 10,也就是将40传入,然后调用本方法,步骤 1 //执行到此说明 n 还是大于0,将40-10传入调用本方法,步骤2 //执行到此说明 n 还是大于0,将30-10传入调用本方法,步骤3 //执行到此说明 n 还是大于0,将20-10传入调用本方法,步骤4 //执行到此说明 n 还是大于0,将10-10传入调用本方法,步骤5 //由于步骤5传入的值是0,不满足if判断,所以没法在执行这里 //接收到步骤 5 所返回的值,执行 i = 0 + n,此处的 n 为10 ,然后执行return返回 0+10 结果给调用步骤4的方法 //接收到步骤 4 所返回的值,执行 i = 10 + n,此处的 n 为20 ,然后执行return返回 10 + 20 结果给调用步骤3的方法 //接收到步骤 3 所返回的值,执行 i = 30+ n , 此处的 n 为30,然后执行return返回 30 + 30 结果给调用步骤2的方法 //接收到步骤 2 所返回的值,执行 i = 60 + n , 此处的 n 为 40,然后执行return返回 60 + 40 结果给调用步骤1的方法 //接收到步骤 1 所返回的值,执行 i = 100 + n , 此处的 n 为 50,然后执行return返回 100 + 50 结果给main方法 return i; } return 0; //返回一个值给刚刚调用步骤 5 的方法 }
用起来没觉得的,说起来真乱,我想不到通俗的解释,如果觉得太乱了就别看了,免得被我误人子弟。。。
好厉害,程序猿我敬你
你说的更加复杂,不过你学的很好啊,大神