python知识点(六)自定义函数对应练习 |
您所在的位置:网站首页 › python中的自定义函数 › python知识点(六)自定义函数对应练习 |
例题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 |