如何在Python中创建递归函数?


递归是一种编程技术,其中函数在其主体中调用自身一次或多次。通常,它会返回此函数调用的返回值。如果函数定义遵循递归,我们称此函数为递归函数。

一个递归函数必须在程序中使用之前终止。如果每次递归调用问题的解决方案都变得更小并朝着基本情况发展,则它会终止,在基本情况中,问题可以在没有进一步递归的情况下解决。如果调用中不满足基本情况,递归可能导致无限循环。

我们在Python中使用递归函数来解决现实世界的数学问题。

前n个自然数之和

以下代码使用递归Python函数返回前n个自然数之和。

示例

这将打印前100个自然数和前500个自然数的和

def sum_n(n):
   if n== 0:
       return 0 
   else:
      return n + sum_n(n-1)
print(sum_n(100)) 
print(sum_n(500))

输出

5050
125250

使用递归的阶乘函数

递归函数是指反复调用自身直到到达递归停止的基本情况的函数。让我们考虑一个简单的Python递归函数示例,该函数计算给定数字的阶乘。

这里,阶乘函数采用正整数n作为参数,并返回该数字的阶乘。如果n等于0,则函数返回1,这是基本情况。否则,函数将自身递归地调用参数n-1,并将结果乘以n。递归将持续到达到基本情况为止。

示例

这将调用参数为5的阶乘函数,这将返回5 * 4 * 3 * 2 * 1 = 120。

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

输出

120

使用递归的斐波那契数列

在此示例中,斐波那契函数采用非负整数n作为参数,并返回斐波那契数列中的第n个数。如果n等于0,则函数返回0。如果n等于1,则函数返回1。否则,函数将自身递归地调用参数n-1和n-2,并返回结果的总和。递归将持续到达到基本情况为止。

示例

这将调用参数为6的斐波那契函数,这将返回斐波那契数列中的第6个数,即8。

def fibonacci(n):
   if n == 0:
      return 0 
   elif n == 1:
      return 1
   else:
      return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(6))

输出

8

如何找到数字的最大公约数

Python中另一个查找两个正整数的最大公约数(GCD)的递归函数示例如下

在此示例中,gcd函数采用两个正整数a和b作为参数,并返回它们的最大公约数。如果b等于0,则函数返回a,这是基本情况。否则,函数将自身递归地调用参数b和a % b(其中%是模运算符),并返回结果。递归将持续到达到基本情况为止。

示例

这将调用参数为24和36的gcd函数,这将返回它们的最大公约数,即12。

def gcd(a, b):
   if b == 0:
      return a 
   else:
       return gcd(b, a % b) 
print(gcd(24, 36))

输出

12

计算正整数的数字之和

在此示例中,sum_digits函数采用正整数n作为参数,并返回其数字之和。如果n小于10,则函数返回n,这是基本情况。否则,函数将n的最后一位数字添加到使用整数除法(//运算符)将n除以10得到的数字之和,并使用结果递归地调用自身。递归将持续到达到基本情况为止。

示例

这将调用参数为12345的sum_digits函数,这将返回其数字之和,即1 + 2 + 3 + 4 + 5 = 15。

def sum_digits(n):
   if n < 10:
      return n
   else:
      return n % 10 + sum_digits(n // 10) 
print(sum_digits(12345))

输出

15

查找字符串的长度

在此示例中,string_length函数采用字符串s作为参数并返回其长度。如果s是空字符串(''),则函数返回0,这是基本情况。否则,函数将1添加到通过切片第一个字符(s[0])并使用剩余字符串(s[1:])递归调用string_length函数获得的字符串的长度。递归将持续到达到基本情况为止。

示例

def string_length(s):
   if s == '':
      return 0
   else:
      return 1 + string_length(s[1:])
print(string_length('hello world'))

输出

11

这将调用参数为'hello world'的string_length函数,这将返回其长度,即11。

递归函数可以是对某些类型问题的强大而优雅的解决方案,但如果设计不当,它们也可能导致无限递归。务必仔细考虑基本情况,并确保函数最终会达到它。

更新于:2023年9月28日

3K+ 次浏览

启动你的职业生涯

通过完成课程获得认证

开始
广告