例题1:一个正整数的阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1,
即n!=1×2×3×...×(n-1)×n。
求n!
def f(n): # 定义递归函数f(n)
if n == 0 or n == 1:
return 1 # 定义当n为0时函数返回值为1
else:
return ① # 递归定义n≥1时的通项公式
#主程序
② = int(input("请输入n:")) # 从键盘上输入n的值
print("n!的值为:", ③) # 输出结果
分析:
第一空:n!=1*2*3*....*n (n-1)!=1*2*3*...*n-1 因此n!=n*(n-1)!
第二空:输入到计算机的数通过赋值给某个变量,即可通过该变量的变量名进行使用
第三空:通过函数名调用函数
答案:
1.n*f(n-1) 2.n 3.f(n-1)
例题2:利用海伦公式求解三角形面积。已知a,b,c为三角形的三条边长,p为三角形的半周长,
即p=(a+b+c)/2,计算此三角形面积S的海伦公式为:
import math # 导入数学模块
def hl(a, b, c): # 定义求三角形面积的函数
p = ①
s = math.sqrt(②) # sqrt用于计算算术平方根
return ③ # 返回面积的值
a, b, c = 3, 4, 5 # 边长依次赋值
print("此三角形的面积S为:", hl(a, b, c))
分析:
第一空、第二空:三角形面积计算公式
第三空:自定义函数的返回值部分,将函数体中的运算结果(变量值)传递回函数调用的地方
答案:
1.(a+b+c)/2 2.p*(p-a)*(p-b)*(p-c) 3.s
例题3:已知斐波拉契数列1,1,2,3,5,8,13,21……,其定义如下:该数列第一项和第二项均为1,从第三项起,每一项的值等于前第一项加前第二项的和。求斐波拉契数列第n项的值。
def f(n): # 定义递归函数
if n == 1 ① n == 2 :
return 1
else:
return ②
n = int(input("请输入正整数n的值:"))
print(③) # 打印结果
分析:
第一空:逻辑运算符:not and or 。两个条件都要满足用and ,只要一个满足用or,取相反值用not
第二空:第n项的值=第n-1项的值+第n-2项的值
用函数求第n项的值表示为f(n),第n-1项的值表示为f(n-1),第n-2项的值表示为f(n-2)
第三空:通过函数名调用斐波那契函数
答案:
1.or 2.f(n-1)+f(n-2) 3.f(n)
例题4:运用辗转相除法求两个正整数的最大公约数。
def f(m, n): # 递归定义函数,求m和n的最大公约数
if ① == 0: # m可以被n整除
return n # 求得最大公约数
②:
q = m % n
return f(n, q)
a = int(input('请输入第一个正整数:'))
b = int(input('请输入第二个正整数:'))
print(③)
分析:
第一空:m可以被n整除意味着n是m的因子,则m除以n的余数应该为0
第二空:双分支结构的关键字
第三空:通过函数名调用自定义函数
答案:
1.m%n 2.else 3.f(a,b)
def gcd(m,n):
r= ① #计算m整除n的余数
while ② : #余数不为0时重复
m=n
n=r
r=m%n
return n
a=int(input('请输入a的值:'))
b=int(input('请输入b的值:'))
print('最大公约数是:', ③(a,b))
答案:
1.m%n 2.r!=0 3.gcd
例题5:输入出生年份(>=1900),输出该年度的生肖,直到输入0结束。已知1900年的生肖是“鼠”。
def shengxiao(year):
zodiac = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"]
index = (year-1900) % 12
return zodiac[①]
myyear = int(input("请输入出生年份,输入0结束:"))
while myyear != ②:
print("你的生肖是:",③)
myyear = int(input("请输入出生年份,输入0结束:"))
分析:
生肖是12年一轮回。根据题目已知,1900年是鼠年,即(1900-1900)%12余数为0——对应生肖列表zodiac中第0个元素,因此,可以通过zodiac[0]获取1900年的生肖为鼠的结果
第一空:通过除以12求出的余数——对应生肖列表中元素的位置——将该余数作为索引号可以获取该年份所对应的生肖
第二空:循环继续的条件为输入的年份不是0
第三空:调用自定义函数
答案:
1.index 2.0 3.shengxiao(myyear)
例题6:火柴棒摆数字
有6根火柴棒,列出所有能摆出的自然数,要求火柴棒正好摆完
分析过程:
1,0-9这十个数字,每个数字分别需要几根火柴棒
根数: 6 2 5 5 4 5 6 3 7 6
2、用6根火柴棒摆出的最小数字是:0
用6根火柴棒摆出的最大数字是:111(位数越多数字肯定越大)
因此:用6根火柴棒摆出的所有数字一定在0-111范围内
则将问题转化为:用穷举法(枚举法)判断0-111这112个数,每个数字需要用多少根火柴棒,如果该数字所用的火柴棒根数=6,则符合题意将该数字输出。
伪代码描述算法:
for i in range(112):
if i所需要的火柴棒根数==6:
print(i)
3.定义一个函数,功能是求出i所需要的的火柴棒根数
def nums(x): #求出x所需要的的火柴棒根数
a=[6,2,5,5,4,5,6,3,7,6] #每个数字所需要的火柴棒根数。如53,需要a[5]+a[3]
#求出x各个位上的数字
#无法确定x是几位数
s=0
while x>0:
m=x%10 #求出目前最低位的数字
s=s+a[m] #将m所需要的的火柴棒根数加到总和s变量中
x=x//10 #将已经算过的部分去除,继续取出剩余部分最低位
#如果x=0,则意味着x这个数已经没有数字可以取了
return s
#x=0这个数字需要6根火柴棒,而while循环最后x必为0,代表没有数字,和单独的数字x=0是不同的情况,因此x=0的火柴棒根数需要在while循环之前单独列出
4.完整代码:
def nums(x):
a=[6,2,5,5,4,5,6,3,7,6]
if x==0:
s=a[0]
else:
s=0
while x>0:
m=x%10
s=s+a[m]
x=x//10
return s
#主程序
for i in range(112):
if nums(i)==6:
print(i)