ホームページ  >  記事  >  バックエンド開発  >  Python の再帰関数を理解するのに役立つ記事

Python の再帰関数を理解するのに役立つ記事

Go语言进阶学习
Go语言进阶学习転載
2023-07-25 16:43:251337ブラウズ

1. 再帰関数とは何ですか?

関数内で他の関数を呼び出すことができます。関数がそれ自体を内部的に呼び出す場合、関数は再帰的です。


#2. 関数の再帰呼び出しの原則

  • 実際には、再帰関数はスタック メモリ上で再帰的に実行され、再帰実行のたびにある程度のスタック メモリが消費されます。

  • #スタック メモリのサイズは、再帰の深さを制限する重要な要素です。

##3. ケース分析

  1. 階乗を見つける

階乗 n を計算! = 1 x 2 x 3 x … x n,

は関数 fat(n) で表現できます。

fact(n) = n! = 1 x 2 x 3 x … x (n-1) x n = (n-1)! x n = fact(n-1) x n

fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。
つまり、fact(n) は再帰的に書かれます:

def fact(n):    if n == 1:        return 1    return n * fact(n - 1)

如果计算fact(6),可以根据函数定义看到计算过程如下:

def fac(n):    if n==1:        return 1    else:        res=n*fac(n-1)        return  res
print(fac(6))

运行结果:

Python の再帰関数を理解するのに役立つ記事

  1. 斐波拉契级数

有这样一个数列:1,1,2,3,5,8,13,21,34…。其第一元素和第二个元素等于 1,其他元素等于其前面两个元素的和。

例:

def fab(n):  # 定义斐波拉契级数    if n in [1, 2]:  # 如果n=1或者2      return 1    return fab(n - 1) + fab(n - 2)  # n>2

print(fab(1))  # 斐波拉契级数的第一个元素
print(fab(2))  # 斐波拉契级数的第二个元素
print(fab(8))  # 斐波拉契级数的第8个元素print(fab(13))  # 斐波拉契级数的第9个元素

运行结果:

Python の再帰関数を理解するのに役立つ記事

  1. 递归函数的优点

定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

递归需要注意递归的深度。由于递归会产生多次函数调用,而函数调用会消耗代码的栈空间,如果递归的深度太大,会导致栈溢出。以上面的阶乘为例,如果计算 100000 的阶乘,在一般机器上都会出现栈溢出的问题。

print(fac(10000))

如下所示:

Python の再帰関数を理解するのに役立つ記事


4. 概要

この記事は Python の基本に基づいています。 Python の標準インタープリタは末尾再帰に対して最適化されていないため、再帰関数にはスタック オーバーフローが発生します。この記事では、再帰関数を使用するメリットとデメリットを紹介します。メリットはロジックがシンプルで明確であることですが、デメリットは過剰な呼び出しによってスタック オーバーフローが発生する可能性があることです。

以上がPython の再帰関数を理解するのに役立つ記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はGo语言进阶学习で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。