学习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. Linux CentOS 6.5 配置网络

    网卡说明 第一块网卡为配置外网:eth0 第二块网卡为配置内网:eth1(没有外网的机器也要将内网配置在第二块网卡上) 1.使用ifconfig查看网卡配置信息 2.修改网卡1配置文件/etc/sys ...

  2. windows 下进程池的操作

    在Windows上创建进程是一件很容易的事,但是在管理上就不那么方便了,主要体现在下面几个方面: 1. 各个进程的地址空间是独立的,想要在进程间共享资源比较麻烦 2. 进程间可能相互依赖,在进程间需要 ...

  3. keynote 代码高亮

    brew install highlight (同时会安装 Lua 和 Boost) highlight -K 18 -s Vampire -u 'utf-8' -O rtf test.html | ...

  4. Nginx配置文件(2)

    一.配置文件结构 1.全局块:配置影响nginx全局的指令.一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等. 2 ...

  5. Struts2中访问web元素的四种方式

    Struts2中访问web元素的四种方式如下: 通过ActionContext来访问Map类型的request.session.application对象. 通过实现RequestAware.Sess ...

  6. SSH Secure Shell Client最新版,解决Win10不兼容问题

    SSH的工具很多,像XShell,SecureCRT等等. 不过我一直用的是:SSH Secure Shell Client 主要的原因就是: 软件本身带文件浏览的功能,可以通过拖拽去实现文件上传和下 ...

  7. hihocoder-1079题解(线段树+离散化)

    一.题目链接 http://hihocoder.com/problemset/problem/1079 二.题意 给定一个长度为L的区间,给你n个子区间,没一个区间涂成一种颜色,问最后这个区间内有几种 ...

  8. Awesome-Link——我的积累、推荐和分享

    积累一些自己看过的比较好的技术博客.以后忘记了可以回过头来看,毕竟有些博客已经写的非常的好了.有些自己写的也会列举在上面.同时还包含一些好用的插件.工具.网站等等. github准备长期更新,欢迎st ...

  9. A very hard Aoshu problem(dfs或者数位)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4403 A very hard Aoshu problem Time Limit: 2000/1000 ...

  10. hash算法 (hashmap 实现原理)

    Hash ,一般翻译做" 散列" ,也有直接音译为" 哈希" 的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出 ...