C语言学习之递归
学习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语言学习之递归的更多相关文章
- 12天学好C语言——记录我的C语言学习之路(Day 7)
12天学好C语言--记录我的C语言学习之路 Day 7: 昨天进行了一天的数组学习,今天大家可以先写几个昨天的程序热热身,回顾回顾,然后今天第一个新程序也是关于数组的,比较难,准备好就开始啦! //输 ...
- 跨语言学习的基本思路及python的基础学习
笔者是C#出身,大学四年主修C#,工作三年也是C#语言开发.但在学校里其他的语言也有相应的课程,eg:Java,Php,C++都学过,当然只是学了皮毛(大学嘛,你懂得),严格来说未必入门,但这些语言的 ...
- 关于C语言学习的一些感想(初学者)
C语言是一门通用计算机编程语言,广泛应用于底层开发.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. 尽管C语言提供了许多低 ...
- C语言学习之路
c语言学习 初识c语言 c语言数据类型.运算符和表达式(整数浮点数) 字符型数据/字符串 算术运算符和算术表达式(优先级,结合性等) 顺序程序设计(运算符之类内容,字符输入输出等) C/C++ 查看数 ...
- 【转】朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)
原文网址:http://bbs.elecfans.com/jishu_354666_1_1.html 再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年 ...
- C语言学习书籍推荐《C Primer Plus(中文版)(第5版)》下载
普拉塔 (Prata S.) (作者), 云巅工作室 (译者) <C Primer Plus(中文版)(第5版)>共17章,介绍了C语言的基础知识,包括数据类型.格式化输入输出.运算符.表 ...
- c语言学习书籍推荐《C语言学习路线图•C语言必须知道的300个问题》下载
下载地址:点我 <C语言学习路线图•C语言必须知道的300个问题>以基础知识为框架,介绍了c语言各部分知识所对应的常见开发疑难问题,并作了透彻地解析.<C语言学习路线图•C语言必须知 ...
- c语言学习目标
运行c语言环境codeblocks. codeblocks的安装: 安装地址:http://www.codeblocks.org/downloads/26 codeblocks-16.01mingw- ...
- C语言学习 第八次作业总结
本次作业其实没有新的内容,主要就是复习上一次的一维数组的相关内容.冯老师布置了5道题目,其中涉及到一些比较简单的排序或者是查找的方法.因为数据很少,所以直接使用for循环遍历就可以了. 关于本次作业, ...
随机推荐
- VI命令汇总
ia/Ao/Or + ?替换 0:文件当前行的开头$:文件当前行的末尾G:文件的最后一行开头:n :文件中第n行的开头 dd:删除一行3dd:删除3行yy:复制一行3yy:复制3行p:粘贴u:undo ...
- SQL列中含有换行符的查找和替换方法
最近在获取数据时,发现程序读取的字段中含有\r\n字符,检查数据库表中的数据,发现是varchar字符串中包含了换行符.导入数据导致了这一情况出现. 回车换行 不同系统的行结尾符号并不同,如下: li ...
- JavaScript(五)语句
js 的语句有 表达式语句, 复合语句{}, 空语句, 声明语句 if 默认不写大括号 可以执行 紧接着的一行 do-while do{}while() while for(初始化:判断:更新){执 ...
- 9、ABPZero系列教程之拼多多卖家工具 拼团提醒类库封装
本篇开始正式做功能,我在开发拼团提醒之前,拼多多并没有放出拼团人数不足就提醒卖家的功能. 有这个想法主要来源于朋友的抱怨,我想这应该是大部分卖家的心声吧. 经过分析,拿到了几个api,不要问我api怎 ...
- isupper()函数
isupper()函数可以用来判断字符c是否为大写英文字母! 原型:extern int isupper(int c); 头文件:ctype.h 功能:判断字符c是否为大写英文字母 说明:当参数c为大 ...
- set使用实例1+lower_bound(val)(个人模版)
set使用实例1+lower_bound(val): #include<stdio.h> #include<set> #include<iostream> #inc ...
- 51 Nod 1028 大数乘法 V2【Java大数乱搞】
1028 大数乘法 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出2个大整数A,B,计算A*B的结果. Input 第1行:大数A 第2行:大数B (A ...
- [POJ2243]考研路茫茫——单词情结
又是AC自动机上用矩乘优化DP= = 其实和上一题基本一样...补集转化思想.. 只是要多弄一个小矩阵求(26^1+26^2+....+26^L),并且也要求f的总和(因为是长度<=L) 直接调 ...
- 互联网App应用程序测试流程及测试总结
互联网App应用程序测试流程及测试总结 1. APP测试基本流程 1.1流程图 仍然为测试环境 Pass 1.2测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日 ...
- Spider爬虫 の 事
初识Spider_Man(爬爬虫) Spider_Man_2 の requests模块 Spider_Man_3 の selenium Spider_Man_4 の BeautifulSo ...