4.2 循环语句
学习while、for循环之前先了解下递归和迭代的概念。 (只学习for、while语句此段可跳过)
1.递归:recursive,循环的意思,递归就是在过程中调用调用自身, 其能力是用有限的语句来定义无限的对象的无限集合。
我们要讲的递归要有递归前进段(没达到条件)、边界条件(确定条件)、递归返回段(满足条件); 也就是一个事件的过程有一个边界条件,没有达到边界条件时,递归前进, 当满足边界条件时,递归返回。这里通过一个大家都熟悉的小故事理解下递归的概念: “从前有座山,山上有座庙,庙里有个老和尚,老和尚正在给小和尚讲故事, 故事讲的是:从前有座山,山上有座庙,庙里有个老和尚,老和尚正在给小和尚讲故事, 故事讲的是:从前.....”, 相信谁也没听过这个故事的完整版,但都能知道这个故事讲的是什么, 这个故事没用边界条件,所以是一个讲不完的故事。 下面我们给他加上边界条件<=5,看编程是怎么讲这个故事的:
循环体=故事=“从前有座山,山上有座庙,庙里有个老和尚, 老和尚正在给小和尚讲故事,故事讲的是:” 次数=1 While(当) 循环体<=n: 循环体=循环体+循环体 次数=次数+1 输出(循环体) 这里我们用编程把无限循环的故事加上了边界给写了下来, 下面用计算机能运行的语言把这个故事写下来,实际运行下:
Story="从前有座山,山上有座庙,庙里有个老和尚,老和尚正在给小和尚讲故事,故事讲的是:"
coun=1
while coun<=5: #这里5可以是任意数,如果5改成更大的数计算机讲报错思考下原因
Story=Story+Story
coun=coun+1
print(Story)
看一下运行结果: 从前有座山,山上有座庙,庙里有个老和尚,老和尚正在给小和尚讲故事,故事讲的是: 从前有座山,山上有座庙,庙里有个老和尚,老和尚正在给小和尚讲故事,故事讲的是: 从前有座山,山上有座庙,庙里有个老和尚,老和尚正在给小和尚讲故事,故事讲的是: 从前有座山,山上有座庙,庙里有个老和尚,老和尚正在给小和尚讲故事,故事讲的是: 从前有座山,山上有座庙,庙里有个老和尚,老和尚正在给小和尚讲故事,故事讲的是:......
为了不占用大量篇幅只展示部分内容。这里循环体就是递归前段,<=5就是边界条件, 输出过程就是递归返回段。从这个小程序可以看出递归就是在运行的过程中调用自己。
斐波纳契数列也是是典型的递归案例。斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, .....1597....这个数列从第3项开始,每一项都等于前两项之和。
2.迭代:iterration,重复的意思,字表的意思不能完全表达迭代的思想。 迭代是重复反馈过程的活动,目的是为了更接近所需结果,每一次重复过程就是一次迭代, 得到的结果作为下一次迭代的初始值。 如果要用迭代计算解决实际问题就要确定三个方面的条件:
(1)迭代变量,确定一个可以不断由旧值递推出新值的载体,这个载体就是迭代变量 (迭代变量是为了便于理解,这个词还没被定义);
(2)迭代表达式,指的是如何从迭代变量的前一个值递推出下一个值的运行公式;
(3)过程控制,为了不让迭代过程无限重复执行,需要给出条件来结束迭代过程,这就是迭代过程控制。 过程控制可以直接给出一个确定的迭代次数的值来控制(例如程序运行最大20次结束), 也可以是通过迭代表达式计算出某个值后结束迭代过程。
下面我们用迭代表达式来计算下斐波纳契数列的前n位数的和。
n=eval(input("输入要查看斐波那契数列前多少位的和:"))
x=0
y=1
for i in range(n):
x,y=y,x+y
z=x+y-1
print(f"斐波那契数列前{n}的和为:{z}")10
每次生成的斐波那契数列的过程就是迭代过程,通过rang(n)控制迭代次数, 最后输出运算结果。
3.递归和迭代区别。递归是一个先展开(递归前进段)后收缩(递归返回段)的运行步骤; 递归是讲一个问题分解成若干小问题,遇到边界条件(递归出口)再原路返回(递归返回, 因此需要保存所有相关的中间值。迭代是逐渐接近,用新的值覆盖旧值,满足条件后结束, 不用保存中间值空间利用率高,所以一般能用迭代的通常不用递归。 为了更直观了解迭代和递归,来看下“1+2+3+4+.....n”使用迭代和递归是怎么运算的:
使用递归法:
n(n)
... 前进段
n+...4+n(4) #需记录4+n(4),
n+...4+3+n(3) #需记录4+3+n(3)
n+...4+3+2+n(2) #需记录4+3+2+n(2)
n+...4+3+2+1+n(1) #需记录4+3+2+1+n(1)
n+...4+3+2+1+n(0) #需记录4+3+2+1+n(0)
n+...4+3+2+1+0 返回段
n+...4+3+2+1
n+...4+3+3
n+...4+6
n+...10
使用迭代法:
0+1=0
1+2=3
3+3=6
6+4=10
10+n=...
以上可以看出递归是先展开后收缩,需要记录每一次循环的值;
迭代则是把旧值带入到新的循环中进行运算。当n足够大时,
递归算法运算时将会出现内存溢出,而迭代法不需要保存每次的计算结果,
不会出现溢出情况,所以为了避免上述问题能用迭代的时候不用递归。