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)

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值