如何在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调用Fibonacci函数,这将返回斐波那契序列中的第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
如何查找数字的GCD:
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。
递归函数可能是某些类型问题的强大而优雅的解决方案,但如果设计不当,它们也可能导致无限递归。重要的是仔细考虑基本情况,并确保函数最终会达到它。