什么是递归?
程序调用自身的编程技巧称为递归
递归作为一种算法在程序设计语言中广泛使用,一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法
它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
递归策略:只需少量的程序就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量
递归的主要思考方式在于:把大事化小
我们来写一个递归
这里也报错了,由于无线递归导致栈溢出了
这就叫栈溢出
每一次函数调用,都会在栈区申请空间,这里递归是无限的,最后就会导致栈溢出
还有一个网站也叫 Stack Overflow
是属于程序员的“知乎”
回到递归
现在有个需求就是输入一个整数,再把它从头到尾打印出来
假设要打印1234的每一位
就可以拆成打印(123)的每一位和4
再拆成打印(12)的每一位和34
再……
最后用代码呈现就是
这个或许能更好理解一些
递归的两个必要条件
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续
2.每次递归调用之后越来越接近这个限制条件
再用图来深刻理解一下
首先输入1234,然后调用 print 函数
第一次的值就是1234
第一次调用进入判断,发现>9,则会进行第二次调用,而且 n/10 第二次的n就是123
第二次再进行判断,然后继续调用,n就是12
第四次调用,n 就变成了1,这下就会打印1
这次的1是第三次调用得来的,这下就回到第三次的12,12%10就是2,所以再打印2
再回到第二次,123%10就是3,就打印3
最后第一次再打印4
这样递归就完成了
递归分为 递推 和 回归
前面的调用就是递推,后面的就是回归
递归练习
编写函数,不允许创建临时变量,求字符串的长度
细品
再者,递归求第n个斐波那契数
关于斐波那契数列:
斐波那契数列是一个由 0 和 1 开始的数列,后面的每一项都等于前两项之和。也就是说:
-
第 0 项是 0
-
第 1 项是 1
-
从第 2 项开始,每一项 = 前一项 + 前前项
这个数列如下:
0,1,1,2,3,5,8,13,21,34,...
它是一种递推关系,在很多算法和数学问题中都有广泛应用,比如动态规划、递归、组合问题等。
这个是实现
虽然看起来简洁一些,但是从后往前推,计算量比较大,算一些较大的数就会力不从心
如果使用函数从前往后算则会比较快