|
因本人不再做技术,
这个blog将不再连载技术文章,
只作为心情点滴的记录,
想学技术的请绕道,谢谢!
联系方式:
feiyu_lili@163.com |
时 间 记 忆 |
« | July 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | |
|
blog名称:飞鱼的成长 日志总数:120 评论数量:488 留言数量:18 访问次数:1043736 建立时间:2006年2月27日 |
 | | | |
|
|
今天学习函数,这是我在看函数递归调用时自己忽视的一个地方。
/* recur.c -- recursion illustration */
#include <stdio.h>
void up_and_down(int);
int main(void)
{
up_and_down(1);
return 0;
}
void up_and_down(int n)
{
printf("Level %d: n location %p\n", n, &n); /* 1 */
if (n < 4)
up_and_down(n+1);
printf("LEVEL %d: n location %p\n", n, &n); /* 2 */
}
这段代码在没有运行的情况下我认为会出现的结果是
500)this.width=500'>
但运行后的结果是:
500)this.width=500'>
这里level 1和LEVEL 1, level 2和LEVEL 2依次类推的数值一样,说明地址一样。
分析的原因是:
当开始执行第四级调用时,n为4,因此if语句的条件不满足。这时不再继续调用up_and_dowm()函数,而是调用接着的执行语句#2,即输出LEVEL4,因为n的值是4。现在执行return语句,此时第四级调用结束,把控制返回给该函数的调用函数,也就是第三级调用函数。第三级调用函数前一个执行语句是if语句中进行第四级调用。因此,它开始继续执行其后续代码,即执行打印语句#2,这将会输出LEVEL3。第三级结束以后调用第二级,依次类推。
自己考虑的时候在只注意了进入的时候是考虑了递归,但在最内层调用结束以后返回的时候就忘了也要考虑递归,这是被我忽视的地方。
|
|
| | |
|