python基础 11 函数③

149 阅读2分钟

一 函数嵌套调用

1 最一般的函数使用方法
    在一个函数中调用其他函数(最一般的函数使用方法)
    def fun3(): 
        print('thisis fun3') 
        print('thisis fun3') 
    def fun2(): 
        print('this is fun2') 
        fun3() 
        print('this is fun2') 
    def fun1(): 
        print('this is fun1') 
        fun2() 
        print('this is fun1') 
    fun1() 
    
2 哥德巴赫猜想
    任何一个大于6的偶数,都能拆分成两个质数的和
    # 大于等于6 
    # 两个质数 和 
    def qzs(n): 
        for i in range(2,int(n**0.5)+1): 
            if n%i==0: 
                return False 
        return True 
    def gdbh(n): 
        for i in range(2,n//2+1): 
            # 判断i 和n-i 是否都是质数 
            if qzs(i) and qzs(n-i): 
                print('%s=%s+%s'%(n,i,n-i)) 
    gdbh(int(input('请输入一个大于等于6的偶数:')))
    

二 递归

递归是一种特殊的嵌套调用 
    自己调用自己 
无限递归: 
    无限的自己调用自己,永远不会退出 
    尽量避免无限递归 
    无限递归会大量消耗内存
        1. 执行效率低 
        2.内存累加 
    递归深度:python允许递归的层数(python预设,1000层---保护系统) 
    解决方案:设置递归的收敛条件 
递归思想: 
    1. 对问题尽心拆分,大问题的解决方案和小问题的解决方案一样(一致) 
    2. 递归一般用于解决难题(简化的是流程) 
# 利用递归求n的阶乘 
def jc(n): 
    if n==1: 
        return 1 
    else: 
        return n*jc(n-1) 
print(jc(int(input('请输入一个整数:')))) 
1 斐波那契数列

    n=int(input('请输入要查看的前n项:'))  
    def fun(n): 
        count = 0 
        a, b = 0, 1 
        while count < n: 
            a, b = b, a + b 
            print(a,end=' ') 
            count += 1 
    fun(n) 
    ================= 
    def fun(n): 
        if n<3:
            return 1 
        else: 
            return fun(n-1)+fun(n-2) 
    n=int(input('请输入要查看的前n项:'))
    for i in range(1,n+1): 
        print(fun(i),end=' ') 
        
2 汉诺塔问题   
    def hnt(froms,to,temp,n):# 从froms柱子 到to柱子,中间利用temp柱子 n盘子的个数 
    # 首先要设置收敛条件 
    if n==1: 
        print('%s--->%s'%(froms,to)) 
        return None 
    else: 
        # 1. n-1个盘子从froms--temp 借助to 
            hnt(froms,temp,to,n-1) 
        # 2. 一个盘子从froms--to 
            print('%s--->%s'%(froms,to)) 
        # 3. n-1个盘子从temp--to 借助froms 
            hnt(temp,to,froms,n-1) 
    hnt('A','B','C',3) 
注意
   1. 不是所有的题都适合用递归 
   2. 递归占资源,运行效率比较慢 
   3. 能用递归写的题,一定能用循环写