请选择 进入手机版 | 继续访问电脑版

C++编程

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1480|回复: 2

函数的递归调用(1)

[复制链接]

3

主题

9

帖子

154

积分

码农

Rank: 2

积分
154
发表于 2016-1-8 23:58:28 | 显示全部楼层 |阅读模式
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用


例子
有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁。问第4个学生岁数,他说比第3个学生大2岁。问第3个学生,又说比第2个学生大2岁。问第2个学生,说比第1个学生大2岁。最后问第一个学生,他说是10岁。请问第5个学生多大。

分析:
要想知道第5个学生的年龄就要知道第4个学生的年龄
要想知道第4个学生的年龄就要知道第3个学生的年龄
要想知道第3个学生的年龄就要知道第2个学生的年龄
要想知道第2个学生的年龄就要知道第1个学生的年龄


age(5)=age(4)+2
age(4)=age(3)+2
age(3)=age(2)+2
age(2)=age(1)+2
age(1)=10

依我现在的能力去思考
age(5)->age(4)->age(3)->age(2)->[age(1)=10]->[age(2)=12]->[age(3)=14]->[age(4)=16]->[age(5)=18]
黑色字体部分像我们平常见过的程序一样是按部就班的进行下去的,给我的感觉就是有理可循,有据可查的,但是红色部分字体给我的感觉就像是,我根本就没有写什么,它自己就自动的无中生有的执行起来了。
我觉得很不可思议。




程序:
#include "stdio.h"
int main()
{
        int age(int n);
        printf("%d\n",age(5));
        return 0;
}
int age(int n)
{
        int c;
        if(n==1)
        {
                c=10;
        }
        else
        {
                c=age(n-1)+2;
        }
        return c;
}


为断点处调试过程:

光标起初是在处的,调用age()函数,然后F10之后光标跳到处,此时n=5,把5代入到c=age(n-1)+2中F10后执行完此条语句后n=4,继续调用age()函数,把4代入到c=age(n-1)+2F10后执行完此条语句后n=3,继续调用age()函数,把3代入到c=age(n-1)+2,F10后执行完此条语句后n=2,继续调用age()函数,把2代入到c=age(n-1)+2,F10后执行完此条语句后n=1,继续调用age()函数,n=1满足if条件,所以执行c=10.以上过程就是上面蓝色字部分的程序执行过程。




然后F10,执行完c=10,光标就到了return c这条语句,继续F10光标指到age()函数函数体最后面的”}“前,继续F10,此时n=2,继续调用age()函数,光标又回到了c=age(n-1)+2,继续F10,c=12,光标指到return c语句前,继续F10光标指到age()函数函数体最后面的”}“前,继续F10,此时n=3,继续调用age()函数,光标又回到了c=age(n-1)+2,继续F10,c=14,光标指到return c语句前,继续F10光标指到age()函数函数体最后面的”}“前,继续F10,此时n=4,继续调用age()函数,光标又回到了c=age(n-1)+2,继续F10,c=16,光标指到return c语句前,继续F10光标指到age()函数函数体最后面的”}“前,继续F10,此时n=5,继续调用age()函数,光标又回到了c=age(n-1)+2,继续F10,c=18,光标指到return c语句前,继续F10光标指到age()函数函数体最后面的”}“前,继续F10,光标指到处,输出结果,继续F10,光标指到下面的return 0处,继续F10,光标指向函数体”}“,继续F10程序结束。
以上就是程序的调试过程。
接下来如果有时间会写汉诺塔问题。一定要给递归算法弄的明明白白。也希望老鸟多多指教,让我了解的更多一些。
回复

使用道具 举报

8

主题

31

帖子

323

积分

版主

Rank: 7Rank: 7Rank: 7

积分
323
QQ
发表于 2016-1-12 13:59:08 | 显示全部楼层
不错,但是要熟练掌握,随时能运用递归,而程序不出错,多练习。
VC纵横、磐实编程网
回复 支持 反对

使用道具 举报

3

主题

9

帖子

154

积分

码农

Rank: 2

积分
154
 楼主| 发表于 2016-1-12 16:56:39 | 显示全部楼层
嬴政 发表于 2016-1-12 13:59
不错,但是要熟练掌握,随时能运用递归,而程序不出错,多练习。

嗯嗯多联系
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|C++编程  

GMT+8, 2019-12-10 05:59 , Processed in 0.093750 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表