📅  最后修改于: 2023-12-03 15:27:21.603000             🧑  作者: Mango
这道题目可以用递归的方式进行求解。首先我们可以观察到这个数列的规律,每个数都是由前一个数得到的。当前一个数是3时,下一个数是5;当前一个数是5时,下一个数是33;当前一个数是33时,下一个数是35。根据这个规律,我们可以写出递归函数的基本结构。
下面是用Python语言实现的递归代码。
def getNumber(n):
if n == 1:
return 3
elif n == 2:
return 5
else:
i = n - 2
last = getNumber(i)
if last == 3:
return 5
elif last == 5:
return 33
elif last == 33:
return 35
elif last == 35:
return 53
在递归函数中,我们首先判断递归的终止条件,当n为1时,返回3,当n为2时,返回5。接着,我们用i表示n-2,然后递归调用getNumber函数得到前一个数last。最后根据last的值计算出当前的数,然后返回。
上面的函数用递归的方式实现,但是递归调用的深度可能会很大,为了避免深度过大引起的问题,我们也可以用非递归的方式实现这个函数,如下所示。
def getNumber2(n):
if n == 1:
return 3
elif n == 2:
return 5
else:
a, b = 3, 5
for i in range(3, n+1):
if (i-2) % 4 == 1:
a, b = b, b*11-8*a
elif (i-2) % 4 == 3:
a, b = b, b*11-6*a
return b
这个函数的实现思路是利用循环计算当前的数。变量a和b分别表示前两个数3和5,然后对于n大于2的情况,我们用循环计算当前的数。如果i-2是4的倍数加1,那么根据递推规则,下一个数是b11-8a;如果i-2是4的倍数加3,那么下一个数是b11-6a。最后返回第n个数$b$即可。
我们可以测试一下这两个函数的性能。用Python中的timeit模块进行测试。
首先测试递归函数的性能。
import timeit
start_time = timeit.default_timer()
print(getNumber(20))
end_time = timeit.default_timer()
print('Time cost of recursive function: ', end_time - start_time)
输出如下:
53
Time cost of recursive function: 0.00038395899708833694
然后是非递归函数的测试。
start_time = timeit.default_timer()
print(getNumber2(20))
end_time = timeit.default_timer()
print('Time cost of non-recursive function: ', end_time - start_time)
输出如下:
53
Time cost of non-recursive function: 1.5278999879831227e-05
这个测试结果显示,非递归函数的性能要比递归函数快很多。