R-4.1 对于一个含有n个元素的序列S,描述一个递归算法查找其最大值。所给出的递归算法的时间复杂度和空间复杂度各是多少?
import numpy as np
def find_max(s, n):
"""
max= {s[0] n = 0
{s[0:n-1]和s[n]中的最大值 n >= 1
:param s: 含有n+1个数的列表
:param n: 列表长度-1,列表最后一个元素的索引
:return: 返回列表的最大值
"""
if len(s) == 0: # 列表为空,返回None
return None
if n == 0: # 达到递归的基本情况:列表只有一个元素,最大值为s[0]
return s[0]
tmp_max = find_max(s, n - 1)
return tmp_max if tmp_max > s[n] else s[n] # 每次返回MAX(前n个数的最大值,最后一个元素)
if __name__ == '__main__':
data = np.random.randint(0, 100, size=5, dtype=np.uint8)
print(data)
maxVal = find_max(data, 4)
print("序列data的最大值为:" + str(maxVal))
R-4.2 使用再代码段4-11中实现的传统函数,绘制出power(2, 5)
函数计算的递归跟踪。
R-4.3 如代码段4-12实现的函数所示,使用重复平方算法,绘制出power(2, 18)函数计算的递归跟踪。
R-4.6 描述一个递归函数,用于计算第n个调和数(harmonic number),其中 H n = ∑ i = 1 n 1 / i H_{n}=\sum_{i=1}^{n}1/i Hn=∑i=1n1/i。
def harmonic_number(n):
if n == 0:
return None
elif n == 1:
return 1
else:
return harmonic_number(n-1) + 1 / n
if __name__ == '__main__':
val = harmonic_number(4)
print(val)
R-4.7 描述一个递归函数,它可以把一串数字转换成对应的整数。例如,13531’对应的整数为13531。
def convert_int(str, n):
if len(str) == 0:
return None
elif n == 0:
return int(str[0])
else:
return convert_int(str, n-1) + int(str[n]) * (10**n)
if __name__ == '__main__':
str = '13531'
print(convert_int(str, len(str) - 1))