第二十二讲:递归是神马
一、知识点:
1、递归:调用函数本身,并有正确的返回条件。
2、递归求阶乘:
非递归方法:
def jiec(i):
result = i
for each in range(1,i):
result *= each
return result
num = int(input('请输入一个整数:'))
result = jiec(num)
print('%d的阶乘是%d'%(num,result))
递归方法:
def jiec(i):
if i == 1:
return 1
else:
return i*jiec(i-1)
num = int(input('请输入一个整数:'))
result = jiec(num)
print('%d的阶乘是%d'%(num,result))
--------------------------------------------------------------------我是一条分割线----------------------------------------------------------------------
二、课后作业:
0.递归在编程上的形式是如何表现的?
在编程上,递归表现为函数调用本身这样一个行为。
1.递归必须满足哪两个基本条件?
1)函数调用本身;
2)设置了正确的返回条件。
2.思考一下,按照递归的特性,在编程中有没有不得不使用递归的情况?
例如:汉诺塔,目录索引,快速排序,树结构的定义。
3.用递归去计算阶乘问题和斐波那契数列是很糟糕的算法,你知道为什么吗?
递归的优点在于易于理解,迭代的优点在于效率。在可理解性相差不大的情况下,优先选择迭代。
4.请聊一聊递归的优缺点:
优点:1、递归的基本思想是把规模大的问题转变成规模小的问题组合,从而简化问题的解决难度;2、有些问题使用递归使得代码简介易懂。
缺点:1、由于递归的原理是调用函数本身,占用大量的内存和时间;2、初学者容易错误的设置返回条件,导致递归代码无休止调用,最终栈溢出,程序崩溃。
--------------------------------------------------------------------我是一条分割线----------------------------------------------------------------------
三、动动手
0.使用递归编写一个power()函数模拟内建函数pow(),即power(x,y)为计算并返回x的y次幂的值。
>>> def power(x,y):
if y == 0:
return 1
else:
return x*power(x,y-1)
1.使用递归编写一个函数,利用欧几里得算法求最大公约数,例如gcd(x,y)返回值为参数x和参数y的最大公约数。
>>> def gcd(x,y):
if y == 0:
return x
else:
return gcd(y,x%y)
--------------------------------------------------------------------我是一条分割线---------------------------------------------------------------------