关于递归的 Python 面试问题。
递归算法是一种直接或间接调用自身函数或者方法,直到某个条件(也称为终止条件或基线条件) 匹配的算法。
例如:计算一个数字的阶乘,如果使用循环,代码如下所示:
python
def factorial(number):
j = 1
if number==0|number==1:
print(j)
else:
for i in range (1, number+1):
j = j*i
print(j)
factorial(5)
使用递归算法解决同样的问题:
python
def factorial(number):
j = 1
if number==0 | number==1:
return j
else:
return number*factorial(number-1)
print(factorial(5))
递归函数使代码看起来很整洁,有助于将复杂的任务分解为更简单的子问题。它比实现迭代更容易。但是,理解递归背后的逻辑可能有点困难。递归会消耗更多的内存和时间,并且很难调试。
问题 1.计算然数之和
编写代码以使用递归计算从 1 到给定数字的自然数之和。
python
def mysum(num):
if num == 0:
return 0
else:
return (num + mysum(num-1))
print(mysum(100)) # 输出:5050
问题 2.以下代码的输出是什么
python
def func(x):
if x%2 == 1:
return x+1
else:
return func(x-1)
print(func(7))
print(func(6))
递归过程解释:
- 调用
func(7)
,x%2==1
成立,返回x+1
,·即func(7)
输出:8。 - 调用
func(6)
,x%2==1
不成立,,进入else
分支,返回func(x-1)
。 - 调用
func(6-1)
,x%2==1
成立,返回x+1
,即x+1
输出:6。
问题 3.以下代码的输出是什么
python
def func(x,y):
if y == 1:
return x[0]
else:
a = func(x, y-1)
if a>x[y-1]:
return a
else:
return x[y-1]
x = [1,5,3,6,7]
y = 3
print(func(x,y))
递归过程解释:
- 调用
func(x, 3)
时:y
不等于1,进入else
分支。 - 调用
func(x, 2)
,此时还是y
不等于1,进入下一层递归。 - 调用
func(x, 1)
,此时y
等于1,返回x[0]
,即列表x
的第一个元素1。 - 返回到之前的递归调用层,将1保存在变量
a
中。 - 然后将1与
x[y-1] = x[1] = 5
比较(此时y = 2),由于1小于5,进入else
分支,返回x[y-1]=x[1]
,列表x
的第二个元素5。 - 继续返回到之前的递归调用层,将5保存在变量
a
中。 - 然后将5与
x[y-1] = x[2] = 3
比较(此时y = 3),由于5大于3,返回a
的值5。 - 最终
print(func(x, y))
输出结果为5
。
问题 4.使用递归编写斐波那契数列
python
def fibonacci(num) :
if num <0:
print("请输入一个整数。")
if num == 0:
return 0
elif num == 1:
return 1
else:
return fibonacci(num-1) + fibonacci(num-2)
for i in range(10):
print(fibonacci(i))
问题 5.以下代码的输出是什么
python
def func(i, j):
if i == 0:
return j;
else:
return func(i-1, j+1)
print(func(6,7))
递归过程解释:
- 调用
func(6,7)
,i == 0
不成立,进入else
分支,返回func(5,8)
。。 - 继续递归调用返回
func(5,8)``func(4,9)``func(3,10)``func(2,11)``func(1,12)
。 - 当调用
func(0,13)
时,i == 0
成立,返回j
,即输出:13。
问题 6.以下代码的输出是什么
python
def func(k):
if k <= 0:
print("请输入一个正数")
elif k == 1:
return 0
else:
return func(k-1) + 2
print(func(6))
递归过程解释:
- 调用
func(6)
,进入else
分支,返回func(5) + 2
。 - 继续递归调用返回
func(4)+2+2``func(3)+2+2+2``func(2)+2+2+2+2
。 - 当调用
func(1)+2+2+2+2+2
时,0+2+2+2+2+2
,即:10。
问题 7.不使用循环输出 1 到 n
python
def myprint(n):
if n > 0:
myprint(n - 1)
print(n, end=' ')
n = 10
myprint(n)
问题 8.不使用循环输出 n 到 1
python
def myprint(n):
if n > 0:
print(n, end=' ')
myprint(n - 1)
n = 10
myprint(n)
问题 9.使用递归的自然数之和
python
def mysum(n):
if n <= 1:
return n
return n+mysum(n - 1)
n = 100
print(mysum(n))
问题 10.使用递归反转输出字符串
python
def reverse(string):
if len(string) == 0:
return
temp = string[0]
reverse(string[1:])
print(temp, end='')
string = "Python"
reverse(string)
文章创作不易,如果您喜欢这篇文章,请关注、点赞并分享给朋友。如有意见和建议,请在评论中反馈!