十二、初阶C语言之函数的递归

1、递归的定义和特点

递归是指程序调用自身的编程技巧,递归的主要思想方式是:把大事化小。

特点:原来的一个大问题就像一颗白菜一样,每一层问题都很相似,每层的解决方法都一样,都能用同一函数来实现。当然也不能使递归变成死递归。

但是它和剥白菜又有一定的区别,剥白菜是剥一层就解决了一层。而递归分为递和归两个步骤,先一层层递到白菜心里,这一过程只是打入白菜内部,再归来的时候才将白菜从内部一层层瓦解。

2、递归例子

I.依次输出某数的最高位到最低位

II.递归实现不创建变量求字符串长度

当有返回值时要注意写法,只有最后结果是输出给外部的,中间归来的都是返回给下一个的

III.递归求斐波那契数列:

主要看递归思路:前两个数之和为第三个数。递归法求斐波那契数列不是最佳方法,因为求一个元素就要求前两个,同一个元素求了太多次(函数调用次数很多最终都都转换成第1和第2个元素),造成时间上极大浪费。

迭代法:

迭代法从小开始求依次迭代到最终要求的那个元素,每个元素都只要求一次,极大程度上节省了时间。

IV.青蛙跳台阶问题:

总共有n阶台阶,青蛙每次可以跳一阶或两阶,问跳到n阶一共有多少种方法

把问题简化可知,我们可以把该问题看做是n可以分为多少个1、多少个2,然后排序(概率论中的捆绑法),把不同分法中的不重复排序个数分别相加,和即为总共的方法数。该问题实际上是斐波那契数列。

递归法解决:

最关键的点在于:函数是代表n阶台阶有多少种不同的走法。递归的思想就可以发挥了,因为fib(n)fib(n-1)+fib(n-2),于是就可以合理地使用递归了。

V.输入三个数,按从大到小输出:

VI.求两个数的最大公约数:

VII.九九乘法表:

上述两种代码中不同之处在于printf(“%-2d”):-号代表左对齐,不带符号指右对齐,2指两位不够默认用空格填充。

可改变行数的乘法表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值