函数看完这篇就登峰造极第三部分 3/4

好了,这篇文章我们主要来讲函数递归,也就是打boss了,递归很重要,但是没必要怕他,相信学完这篇你也能说一句,小小递归,ez拿捏。

 什么是递归?

 程序调用自身的编程技巧称为递归( recursion)。

递归做为一种算法在程序设计语言中广泛应用。

一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复
杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可
描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归的主要思考方式在于:把大事化小,一步步去让机器运行重复的工作
递归的两个必要条件 :
存在限制条件,当满足这个限制条件的时候,递归便不再继续。
每次递归调用之后越来越接近这个限制条件。

学了递归之后,你才能真正地感受程序运行的快感,这是一种无法言说的成就感

什么是递归?就是递推回归,请注意,递推过后还要回归,那具体是什么意思呢,用一个代码讲透。来看下面这道题,我的讲解会涉及很多方面,可以自己思考一下先,更有感触。

接受一个整型值(无符号),按照顺序打印它的每一位。 例如: 输入:1234,输出 1 2 3 4.

首先,这道题上来就给了一个王炸,什么是无符号的整型值?噢我知道了,也就是像题目说的那样-1234或者1234这种类型的都不可能出现,只能出现0或者正整数,但是这又怎么了呢,如果把无符号去掉呢?有人可能想到,我先判断一下,如果是负的,我把他变成正的不就好了吗?这种想法很方便,确实可以解题,但是单从认知角度来说我肯定不希望你这样直接想。当然这里只是举个反例,我们如果基础很扎实,马上就会想到,这里重点并不是计算的问题,而是你定义的变量int类型是默认正数的,难在输入。噢,这样一想还真的是,我在输入的时候已经不能用int了,得用什么呢?

对了,就是unsigned int 。这就是无符号整型变量的用法。

再者,打印他的每一位,数位分离这是我们的基本功,但是我们所得到的数据是4321,如果简单的把这些数据存储起来再逆序输出,可又会涉及到这个数的位数问题是未知的,不好搞定。但是常规的想法就是按位输出,如何再拿到4321,最后1234就可以了,按位输出可以用一个for循环加while循环去实现,当数/10=0的时候为假就可以了,然后灵光一现,我可以用一维数组去存储这些数字啊,最后按照下标逆序输出不就好了。ok,想到这,你已经很熟练了对于数组和循环。但是这样实现注定太过繁杂。我们既然讲到递归,就用上看看。

#include <stdio.h>
void print(int n)
{
 if(n>9)
 {
 print(n/10);
 }
 printf("%d ", n%10);
}
int main()
{
 int num = 1234;
 print(num);
 return 0;
}

看这个代码,print函数就是我们实现递归的空间

这幅图你应该就能看懂递归的逻辑了,这就是前面我标红的原因,真正去理解这个递归的含义,画图实操一遍后,你会发现递归也就那么回事,就是剥洋葱,剥完以后再给他恶趣味地放回去就是了。

好了,关于回归的还有一个迭代没讲,关于汉诺塔和斐波那契数列我明天再发,辛苦各位的观看了,夜深了,能坚持到这里的你很有毅力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值