Python 递归函数

简介: 它能够把一个大型复杂的问题转化为一个与原问题相似的较小规模的问题来求解,用非常简洁的方法来解决重要问题。就像一个人站在装满镜子的房间中,看到的影像就是递归的结果。以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……程序设计可以让你的工作由几天节约至几个小时,好的算法可能可以让你的程序运行时间从几个小时节约至几秒钟。被计算了无数次,如果我们能在第一次计算出来后就存储下来,以供后面使用,会不会快些?,基例不需要再次递归,它是确定的表达式;
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页: 小嗷犬的博客
🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。
🥭本文内容:Python 递归函数

1.引入

递归是一种广泛应用算法。它能够把一个大型复杂的问题转化为一个与原问题相似的较小规模的问题来求解,用非常简洁的方法来解决重要问题。就像一个人站在装满镜子的房间中,看到的影像就是递归的结果。递归在数学和计算机应用上非常强大,能够非常简洁的解决重要问题。程序设计中,通过函数定义中调用函数自身的方式来实现 递归

数学上有个经典的递归例子叫阶乘,阶乘通常定义为:

$n! = n * (n-1) * (n-2)... * 2 * 1$

这个关系给出了另一种方式表达阶乘的方式:
$n! =
\begin{cases} 1 & \text{n=0} \\ n*(n-1)! & \text{n>0} \end{cases}$

阶乘的例子揭示了递归的2个关键特征:
(1)存在一个或多个基例,基例不需要再次递归,它是确定的表达式;
(2)所有递归链要以一个或多个基例结尾。

根据用户输入的整数 n, 计算并输出 n 的阶乘值:

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

num = int(input("请输入一个整数: "))
print(f'{num}的阶乘为:{factorial(num)}')
基例有时不止一个,可能有多个。

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)。以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……


2.斐波那契数列

在数学上,斐波纳契数列以如下被以递推的方法定义:
$F(1)=1, F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3, n∈N)$

这个数列从第3项开始,每一项都等于前两项之和。

编写程序,用户输入正整数 n,输出斐波那契数列的前 n 项:

def fibo(i):
    if i in (0,1):
        return 1
    else:
        return fibo(i-1) + fibo(i-2)
    
num = int(input('请输入一个大于 3 的正整数 :'))
print('\n斐波那契数列的前 {} 项为:'.format(num))
for i in range(1, num+1):
    print(fibo(i), end=' ')
试试打印出前50项。

如此之慢的原因是什么?

每次在计算第i项值时,都需要递归调用直到fibo(0),也就是说像fibo(0),fibo(1),fibo(2),fibo(3)被计算了无数次,如果我们能在第一次计算出来后就存储下来,以供后面使用,会不会快些?

让我们使用字典改进一下:

calculate_dic = {1: 1, 2: 1}

def fibByDic(n):
    if n not in calculate_dic:
        new_value = fibByDic(n-1) + fibByDic(n-2)
        calculate_dic[n] = new_value
    return calculate_dic[n]
num = int(input('请输入一个大于3的正整数:'))
print('\n斐波那契数列的前{}项为:'.format(num))
for i in range(1, num + 1):
    print(fibByDic(i), end=' ')
和简单的递归相比较,速度是否快到让你怀疑人生?所以,有的时候 算法很重要。

程序设计可以让你的工作由几天节约至几个小时,好的算法可能可以让你的程序运行时间从几个小时节约至几秒钟。

目录
相关文章
|
24天前
|
开发者 Python 容器
python函数基础以及函数参数简解
python函数基础以及函数参数简解
|
1天前
|
Java Python
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
【9月更文挑战第18天】在 Python 中,虽无明确的 `interface` 关键字,但可通过约定实现类似功能。接口主要规定了需实现的方法,不提供具体实现。抽象基类(ABC)则通过 `@abstractmethod` 装饰器定义抽象方法,子类必须实现这些方法。使用抽象基类可使继承结构更清晰、规范,并确保子类遵循指定的方法实现。然而,其使用应根据实际需求决定,避免过度设计导致代码复杂。
|
4天前
|
Python
全网最适合入门的面向对象编程教程:Python函数方法与接口-函数与方法的区别和lamda匿名函数
【9月更文挑战第15天】在 Python 中,函数与方法有所区别:函数是独立的代码块,可通过函数名直接调用,不依赖特定类或对象;方法则是与类或对象关联的函数,通常在类内部定义并通过对象调用。Lambda 函数是一种简洁的匿名函数定义方式,常用于简单的操作或作为其他函数的参数。根据需求,可选择使用函数、方法或 lambda 函数来实现代码逻辑。
|
17天前
|
Python
python 函数
【9月更文挑战第4天】python 函数
36 5
WK
|
24天前
|
Python
python中的函数有哪些种类?
在 Python 中,函数根据定义方式、用途及来源可分为多种类型:自带的内置函数(如 print(), len())无需导入直接使用;标准库函数需导入相应模块后使用;第三方库函数则需先安装库再导入使用;用户自定义函数可根据需求定义并多次调用;匿名函数(lambda)无函数名,常用于需要函数对象但不想单独定义的情形;高阶函数接受或返回函数;装饰器函数可在不改动原函数代码情况下为其添加新功能;生成器函数使用 yield 逐个返回值;递归函数在自身定义中调用自身;嵌套函数在一个函数内定义,可访问外部函数变量。各种函数类型在编程中有不同的用途和优势。
WK
39 12
|
22天前
|
Python
Python 中 help() 和 dir() 函数的用法
【8月更文挑战第29天】
19 5
|
23天前
|
Python
12类常用的Python函数
12类常用的Python函数
|
24天前
|
Python
python中getattr函数 hasattr函数
python中getattr函数 hasattr函数
|
24天前
|
算法 Python
python函数递归和生成器
python函数递归和生成器
|
23天前
|
Python
Python eval()函数的使用
Python eval()函数的使用
18 1