python知识点(六)自定义函数对应练习

您所在的位置:网站首页 python中的自定义函数 python知识点(六)自定义函数对应练习

python知识点(六)自定义函数对应练习

2024-02-08 10:16| 来源: 网络整理| 查看: 265

例题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)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3