计算机科学-第15周 递归函数 题目及参考解答

简介: 《计算机科学》课程主页在:http://blog.csdn.net/sxhelijian/article/details/137055971、阅读下面关于递归函数的程序,在草稿纸上画出函数调用“递推-回归”的过程,得出运行结果,并和实际运行结果进行对照(1)#include <stdio.h>int fact(int n);int main(){ long x=0

《计算机科学》课程主页在:http://blog.csdn.net/sxhelijian/article/details/13705597


1、阅读下面关于递归函数的程序,在草稿纸上画出函数调用“递推-回归”的过程,得出运行结果,并和实际运行结果进行对照
(1)

#include <stdio.h>
int fact(int n);
int main(){
    long x=0,y=0;
    x=5;
    y=fact(x);
    printf("%ld\n",y);
    return 0;
}
int fact(int n){
    long f=0;
    if(n==1)
        f=1;
    else
        f=n*fact(n-1);
    return f;
}
通过绘出“递推-回归”图,你认为运行结果为:____________________
实际运行的结果为:_________________

(2)

#include <stdio.h>
void f(int n)
{
    if(n>=10)
        f(n/10);
    printf("%d\n",n);
}
int main()
{
    f(12345);
    return 0;
}
通过绘出“递推-回归”图,你认为运行结果为:____________________
实际运行的结果为:_________________


2、阅读下面关于递归函数的程序,写下你认为的运行结果,并和实际运行结果进行对照,然后通过“单步执行”,观察这些递归函数的执行过程。
(1)
#include <stdio.h>
void recur(char c)
{
    printf("%c\n",c);
    if(c<'5') recur(c+1);
    printf("%c\n",c);
}
int main()
{
    recur('0');
    return 0;
}
你认为运行结果为:__________________
实际运行的结果为:_________________
请用“单步执行”跟踪。

(2)

#include <stdio.h>
void f(int n);
int main ()
{
    int  i=1234;
    f(i);
    return 0;
}


void f(int n)
{
    if(n==0)
        return;
    else
    {
        printf("%d\n",n%10);
        f(n/10);
        printf("%d\n",n%10);
        return;
    }
}
你认为运行结果为:__________________
实际运行的结果为:_________________
请用“单步执行”跟踪。


3、楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序计算共有多少种不同的走法?通过自定义的递归函数求解这个问题。
  提示:设n阶台阶的走法数为f(n)。
  • n=1时,一步上去,有1种走法;
  • n=2时,可以一步1阶,分两步上去,也可以一步2阶,用一步上去,共有2种走法;
  • n个台阶时,看最后一步怎么走。最后一步走1阶,走法为f(n-1)种,而最后一步走2阶,趟法为f(n-2)种,所以,总的走法种数是f(n-1)+f(n-2)
  所以,编程序解下面的方程,即是本题解法:

   
  参考解答:

#include <stdio.h>
int f(int n);
int main(){
    int x,y;
    x=5;
    y=f(x);
    printf("%d\n",y);
    return 0;
}
int f(int n){
    int m;
    if(n==1)
        m=1;
    else if(n==2)
        m=2;
else
    m=f(n-1)+f(n-2);
    return m;
}


4、编写程序,计算ackerman函数值并运行程序求出A(3,2)的值。

  

参考解答:

#include"stdio.h"
int Ackerman(int m,int n)
{
    //printf("n=%d, m=%d\n",n, m);
    if(m==0)
        return n+1;
    else if(n==0)
        return Ackerman(m-1,1);
    else
        return Ackerman(m-1,Ackerman(m,n-1));

}
int main()
{
    int n,m;
    scanf("%d%d",&m,&n);
    printf("%d\n",Ackerman(m,n));
    return 0;
}
  提示:执行程序求A(4,3),将类似陷入死循环。原因是递归的层次太多,计算机在急速运行中,直到内存耗尽。
  实际上,当m≥4,Ackermann函数的增长快得惊人。Ackermann(4,2)=2^65536-3有19729位,而Ackermann(4,3)则即使是位数也不易估计。
  计算机要求解这样的函数,也得另辟他径。





目录
相关文章
|
C++
2014秋C++第9周项目1参考-利用循环求和
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703。课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。   【项目1:利用循环求和】求1000以内所有偶数的和 要求:请编出3个程序来,分别用三种循环语句完成,注意体会各种循环语句的执行过程及语法特点。 参考解答://用for循环完成 #include &
1310 0
|
C++ 搜索推荐
2014秋C++第16周 项目1参考 数组的排序
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。  【项目1-数组的排序】按给定部分程序的要求,用指向数组的指针变量作为形式参数编写函数,完成排序。重点体会:(1)排序算法,可以是冒泡,也可以是选择;(2)用指向数组的指针变量作为形式参数,用数组名
1168 0
|
C++ C语言
2014秋C++第16周 项目2参考 用指针玩字符串
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。  【项目2-用指针玩字符串】  指针是神奇的,指向整型的指针int *p1,可以操作整型数组int a[];指向字符型的指针char *p2,可以操作字符数组(字符串)char str[];更灵活的是
1297 0
|
C++
2014秋C++第16周 项目3参考 用函数指针调用函数
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。  【项目3-用函数指针调用函数】  将下面的程序补充完整(包括定义函数),使其能够完成图示的功能。请使用已有程序的风格。 void eat(); void sleep(); void hitdoud
1249 0
|
C++
2014秋C++第16周 项目4参考 为动态数组扩容
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。  【项目4-为动态数组扩容】  下面的程序,利用动态数组保存学生的成绩。当再有一批学生成绩需要保存时,要为之扩容(和吃自助一样,用多少,取多少,这好),请补充完整下面的程序,实现如图所示的功能。 i
1248 0
|
C++
答大一学生:英语成绩不好,能有多大发展空间
【来信】   贺老师好,我是烟台大学、软件工程专业的一名学生,现在是大一。我想问下您,英语成绩不好,在计算机这行能有多大的发展空间,有哪些方向。【回复】  英语不好,总体讲,会对你的发展会有限制,无论从事哪个方向。“限制”并不意味着你失去机会,你仍然可以在这个行业中做下去,但不能跟行业的最新发展同步,始终通过二手的材料学习、工作。  你提到的话题是“英语成绩不好”,而不是我说的“英语不好”。其
1461 0
|
算法 Java Android开发
给非专业职场新人——补上基础,用好现在
【来信】贺老师!您好!   我昨天无意中发现您的博文,给我的震撼挺大的。感觉您是一个充满正能量、积极向上、无私奉献的人,过多溢美之词我就不多说了,直接步入主题吧。   我是12年本科毕业于四川大学,学的专业和计算机完全没关系,但本身对编程有一定兴趣,大学自学了点Java,毕业后进了华为做成本核算类的工作。对这份工作我完全提不起兴趣,并且也比较闲,感觉自己没什么进步,所以就萌生了辞职的想法。但当
3207 0
|
算法 C++ C语言
给想上MIT的牛学生说几句
【来信】 老师您好!  很冒昧的来打扰您,只是在学习上实在有些困惑才来向您求教一番。  我是计算机科学与技术的大一学生,我非常喜欢我自己的专业,但是学校里讲的东西太慢,太浅,所以我一般都是自学,我在自学的时候最大的问题不是学习本身的问题,而是方向的问题,我学的东西很杂,在这大半段的大一生活里,我学了C,一些win32编程,还有一些简单的socket编程,还学了一些C通过ODBC操作数据库。现在
1673 0
|
C++
C++第9周(春)项目2 - Time类
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 【项目2】在第8周项目2基础上(1)定义对时间对象的自增和自减一目运算符 //一目运算符的重载 CTime operator++(int);//后置++,下一秒 CTime operator++();//前置++,下一秒,前置与后置
1345 0
|
C++ 机器学习/深度学习 移动开发
C++第9周(春)项目3 - 分数类
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 【项目3】在第8周项目3基础上(1)定义分数的一目运算+和-,分别代表分数取正和求反,将“按位取反运算符”~重载为分数的求倒数运算。(2)定义分数类中&lt;&lt;和&gt;&gt;运算符重载,实现分数的输入输出,改造原程序中对运算结果显
1282 0