python递归

python递归

  • 1. 数字减一
  • 2. 斐波那契数
  • 3. 阶乘
  • 4. 汉诺塔
  • 5. 利用递归函数调用方式,将输入的字符以相反的顺序打印输出
  • 6. 利用递归求年龄
  • 7. 求和
  • 8. 青蛙跳台阶
  • 9. a 的 n 次方
  • 10. 递归步骤

函数自己调用自己。

1. 数字减一

def fun(a):  
    # 递归的出口,当参数满足某个条件时,不再执行函数,不增加这个判断会出现死循环
    if a == 0:
        return
    print(a)
    # 函数内自己调用自己
    fun(a - 1)
    print(a)

fun(3)

python递归_第1张图片

方式二:

def fun(a):
    if a > 0:
        print(a)
        fun(a - 1)
        print(a)

fun(3)

递归执行的过程:递和归这两个过程。
递过程,函数再执行的过程中不断的调用自己,第一次给fun传入一个3,当前这个函数还没有结束,程序将3减1又执行到了下一个函数,下一个函数没结束 又进入到一个函数中,那什么时候停止呢?也就是我们的递归出口,a == 0的时候 不再执行函数。
归过程,最里层的函数如果满足条件的话(满足条件会将这层函数执行完毕,打印输出的东西也会打印输出),它们会一层一层的返回出来,返回的位置直到调用它的位置。

2. 斐波那契数

题目:求第n位的斐波那契数

它的规律为:1,1,2,3,5,8,13,21……,输出其前20个数字
规律:第一个和第二个数字相等,第三个数字等于前两个数字相加,第四个数字又等于第二个和第三个数字相加,以此类推。
数学规律为: f1=f2=1 f3=f1+f2 f4=f2+f3 f5=f3+f4 fn=f(n-2)+f(n-1)。

def fun(n):
        if n <= 2:
            return 1
        else:
            return fun(n - 1)+ fun(n - 2)
a = int(input("请输入第n个斐波那契数:"))
print("第"+str(a)+"个斐波那契数:",fun(a))

3. 阶乘

比如:
3的阶乘 = 1 * 2 *3,得积就是6,3的阶乘就是6
4的阶乘 = 1 * 2 *3 * 4,得积就是24,4的阶乘就是24
5的阶乘 = 1 * 2 *3 *4 *5,得积就是120,5的阶乘就120

如果n的值是5,那么:
fun(1) = 1
fun(2) = 2 * fun(1)
fun(3) = 3 * fun(2)
fun(4) = 4 * fun(3)
fun(5) = 5 * fun(4)

方式一:

def fun(n):
    result = n
    for i in range(1,n):
        result *= i
    return result
a =  int(input("请输入一个正整数:"))
b = fun(a)
print(b)

方式二:

def fun2(n):
    if n == 1:
        return 1
    else:
        return n * fun2(n-1)

a = int(input('请输入一个正整数:'))
b = fun2(a)
print(b)

4. 汉诺塔

汉诺塔,又称河内塔,是一个源于印度古老传说的益智玩具。这个玩具有a,b,c三根柱子,在a柱子上从下往上按照大小顺序摞着圆盘。需要把圆盘从下面开始按大小顺序重新摆放在另c根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

题目分析:
1)第一步需要借助c把a上n-1个圆盘放入b中,然后把a剩下的最大圆盘放进c中,这就完成了最底层圆盘的移动
2)借助c把b上n-1个圆盘放入a中,再把b中最大的圆盘放入c中,这就完成了二层圆盘的移动

比如:
有1个圆盘时:
A --> C
有2个圆盘时:
A --> B
A --> C
B --> C
有3个圆盘时:
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C

def hanoi(n, a, b, c):
    if n == 1:
        print(a, ' --> ', c)
    else:
        hanoi(n-1, a, c, b) # 将前n-1个圆盘从a移动到b上
        print(a, ' --> ', c) # 将最底下的最后一个圆盘从a移动到c上
        hanoi(n-1, b, a, c) # 将b上的n-1个圆盘移动到c上

n = int(input('请输入汉诺塔的层数:'))
hanoi(n, 'A', 'B', 'C')

5. 利用递归函数调用方式,将输入的字符以相反的顺序打印输出

def fun(string,len):
    if len == 0:
        return
    print(string[len-1],end="")
    fun(string,len-1)
string = input("请输入字符:")
len = len(string)
fun(string,len)

6. 利用递归求年龄

题目:有5个人坐在一起,
问第五个人多少岁?他说比第4个人大2岁。
问第4个人岁数,他说比第3个人大2岁。
问第3个人,又说比第2人大两岁。
问第2个人,说比第一个人大两岁。
最后问第1个人,他说是10岁。请问第五个人多大?

递归见名之意,有一个递(去)的过程和归的过程,要想知道第五个人的年龄首先要知道第四个人的年龄,要想知道第四个人的年龄要知道第三个人的年龄,以此类推,找到第一个人年龄时,再回推。

def fun(a):
    if a == 1:
        n = 10
    else:
        n = fun(a - 1) + 2
    return n
age = fun(5)    
print("第五个人的年龄为:",age)

7. 求和

计算1+2+3+…+n的和

def fun(n):
    if n == 1:
        return 1
    else:
        return n + fun(n - 1)
print(fun(3))

8. 青蛙跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

比如:

n(台阶个数) 跳法(种) 规律
1 1 f1 = 1
2 2 f2 = 2
3 3 f3 = f2+f1
4 5 f4 = f3 + f2
5 8 f5 = f4 + f3
n fn = f(n-2) + f(n-1)
def fun(n):
    if n == 1 or n == 2:
        return n
    else:
        return fun(n - 1) + fun(n - 2);

a = int(input("请输入台阶的个数:"))
b = fun(a)
print("有"+str(b)+"种跳法")

9. a 的 n 次方

要求:n次方为正整数,小于0时返回1
a的n次方相当于n个a相乘

比如:a的3次方 = a * a * a

def fun(a,n):
    if n > 0:
        return a * fun(a,n-1)
    else:
        return 1
a = int(input("请输入底数:"))
b = int(input("请输入幂:"))
c = fun(a,b)    
print(str(a)+"的"+str(b)+"次方等于:",c)

10. 递归步骤

  1. 定义函数
  2. 终止条件(出口)
  3. 等价关系式
  4. 函数调用

你可能感兴趣的:(Python,python,算法)