学习C语言到递归时,还记得那个用来抛砖引玉的例子: "从前呀,有座山,山里有个老和尚给一个小和尚讲故事,讲的什么故事呢?从前呀,有座山,山里有个老和尚给一个小和尚讲故事,讲的什么故事呢?从前呀......" 这个故事估计是可以说到世界毁灭 。不难发现整个故事都在循环一个语句 "从前呀,有座山,山里有个老和尚给一个小和尚讲故事,讲的什么故事呢?",那么递归的定义呢就和这差不多了。

  递归: 百度百科解释为 程序调用自身的编程技巧。

  利用递归,我们可以完成许多事情。比如传统的 1+2+3+4+5+......+99+100 这样的求和就可以利用递归来完成

#include"stdio.h"
//递归
int recurrence(int n)
{
if(n == )
return ;
else
  return recurrence(n - ) + n;
}
int main(void)
{
printf("%d", recurrence());
}

  说到递归,少不了著名的斐波那契数列,同样的它也是一个递归的典型例子。

表达式: F[n]=F[n-1]+F[n-2](n>=2,F[0]=0,F[1]=1)

  由表达式,我们就可以写出对应代码

#include"stdio.h"
//斐波那契数列
int recurrence(int n)
{
if(n == )
return ;
else if(n == )
return ;
else
return recurrence(n - ) + recurrence(n - );
}
int main(void)
{
int i;
for(i = ; i <= ; i ++)
printf("%d ", recurrence(i));
}

  通过以上代码,就可以秒秒钟打印出斐波那契数列的前10项了,其实和 1+2+3+......+99+100没有本质上的区别。就和百度百科给出的定义一样是程序多次调用它本身。下面再举个相关的经典例子加深一下理解。

  又是一个典型的粟子:

  猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个;第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。问第一天共摘了多少个桃子?

  相信大家都 AC 过这道例题,这猴子也是挺厉害的,第一天竟然吃了700多个桃子,Amazed...,此题不止有递归一种方法,你尽管可以用 while 、for 循环来 A.大多数递归题可以用循环来A,说白了递归本身就是循环。好像我在说废话。。。。

  根据题意,可以写出对应的代码:

#include"stdio.h"
//猴子吃桃问题
int recurrence(int n)
{
if(n == )
return ;
else
return * (recurrence(n - ) + );// 逆运算 根据题意今天的桃子加上一个再乘以二就是前一天的桃子数量
// 依次类推就可以推出10前共有多少桃子
}
int main(void)
{
printf("%d ", recurrence());
}

  运用递归,就感觉是在套用公式。这么说递归其实很简单的,我们反过来做此题。就说猴子是摘桃,第一天摘了一个、第二天摘了前一天加一个的二倍、以后的每一天都如此,第10天后一共摘1534个桃子,问这10天每天分别有多少桃子?

  不难得出,这个就是上个粟子的逆向转换而已。则相应代码如下:

#include"stdio.h"
//猴子摘桃问题
int recurrence(int n)
{
if(n == )
return ;
else
return (recurrence(n + ) - ) / ;// 逆运算 根据题意今天的桃子送去一个再除以二就是明天的桃子数量
// 依次类推就可以推出10后共有多少桃子
}
int main(void)
{
int i;
for(i = ; i <= ; i ++)//打印列表
printf("%d ", recurrence(i));
}

  只是对之前的代码进行了少许的修改,已知第10天摘了1534个桃子,那么当 i = 10 时, 返回 1534 这个值;否则是调用递归运算,递归也就是对题意进行了逆向的推算。

  故做题时,先审清题意,理好思路,再动手去做就游刃有余了,递归亦如此。

C语言学习之递归的更多相关文章

  1. 12天学好C语言——记录我的C语言学习之路(Day 7)

    12天学好C语言--记录我的C语言学习之路 Day 7: 昨天进行了一天的数组学习,今天大家可以先写几个昨天的程序热热身,回顾回顾,然后今天第一个新程序也是关于数组的,比较难,准备好就开始啦! //输 ...

  2. 跨语言学习的基本思路及python的基础学习

    笔者是C#出身,大学四年主修C#,工作三年也是C#语言开发.但在学校里其他的语言也有相应的课程,eg:Java,Php,C++都学过,当然只是学了皮毛(大学嘛,你懂得),严格来说未必入门,但这些语言的 ...

  3. 关于C语言学习的一些感想(初学者)

    C语言是一门通用计算机编程语言,广泛应用于底层开发.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. 尽管C语言提供了许多低 ...

  4. C语言学习之路

    c语言学习 初识c语言 c语言数据类型.运算符和表达式(整数浮点数) 字符型数据/字符串 算术运算符和算术表达式(优先级,结合性等) 顺序程序设计(运算符之类内容,字符输入输出等) C/C++ 查看数 ...

  5. 【转】朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)

    原文网址:http://bbs.elecfans.com/jishu_354666_1_1.html 再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年 ...

  6. C语言学习书籍推荐《C Primer Plus(中文版)(第5版)》下载

    普拉塔 (Prata S.) (作者), 云巅工作室 (译者) <C Primer Plus(中文版)(第5版)>共17章,介绍了C语言的基础知识,包括数据类型.格式化输入输出.运算符.表 ...

  7. c语言学习书籍推荐《C语言学习路线图•C语言必须知道的300个问题》下载

    下载地址:点我 <C语言学习路线图•C语言必须知道的300个问题>以基础知识为框架,介绍了c语言各部分知识所对应的常见开发疑难问题,并作了透彻地解析.<C语言学习路线图•C语言必须知 ...

  8. c语言学习目标

    运行c语言环境codeblocks. codeblocks的安装: 安装地址:http://www.codeblocks.org/downloads/26 codeblocks-16.01mingw- ...

  9. C语言学习 第八次作业总结

    本次作业其实没有新的内容,主要就是复习上一次的一维数组的相关内容.冯老师布置了5道题目,其中涉及到一些比较简单的排序或者是查找的方法.因为数据很少,所以直接使用for循环遍历就可以了. 关于本次作业, ...

随机推荐

  1. php的二维数组排序

    //建立一个$arr的二维数组 $arr=array( array('name'=>'e','age'=>5), array('name'=>'b','age'=>2), ar ...

  2. 3.If statements

    if 语句   电脑程序不只是执行命令.时常会需要做出选择.例如基于一个条件的选择.Python有这样几种条件运算:   >   greater than <   smaller than ...

  3. [转]Python的3种格式化字符串方法

    本文转自: 夏日微风Python笔记 传统C语言式 命名参数 位置参数 1. 传统C语言式 和c语言里面的 sprintf 类似,参数格式也一样 title = "world" y ...

  4. java_web学习(五) JSTL标准标签库

    1.什么是JSTL JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. ...

  5. 认识Java中的字符串

    Java 中 String 类的常用方法 Ⅰ String 类提供了许多用来处理字符串的方法,例如,获取字符串长度.对字符串进行截取.将字符串转换为大写或小写.字符串分割等,下面我们就来领略它的强大之 ...

  6. c/s与b/s 动态网站与静态网站 (网站编码统一“UTF-8”)

    1.c/s和b/s 第一张图是b/s  可以随时随地的浏览  (在服务器增加网页就能增加功能,只要改变网页就能使用户同步更新,共享性也强,开发也简单,在广域网和局域网都能建造b/s结构,然后通过int ...

  7. HDU 1010 Tempter of the Bone【DFS经典题+奇偶剪枝详解】

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  8. A. Duff and Meat

    A. Duff and Meat time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  9. Let the Balloon Rise(水)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1004 Let the Balloon Rise Time Limit: 2000/1000 MS (J ...

  10. 关于win10系统安装VMware12Pro后,win10系统的 控制面板\网络和 Internet\网络连接\更改适配器选项卡中 没有虚拟网卡VMnet1和VMnet8图标,该如何把他们显示出来呢?

    安装VMware12Pro后,PC主机通过命令行:ipconfig/all ,查看发现没有VMnet1和VMnet8. 然后我首先尝试打开VMware12Pro的虚拟网络编辑器: 然后先点击" ...