📌  相关文章
📜  程序找到系列3、5、33、35、53…的第N个项。(1)

📅  最后修改于: 2023-12-03 15:27:21.603000             🧑  作者: Mango

程序找到系列3、5、33、35、53…的第N个项

这道题目可以用递归的方式进行求解。首先我们可以观察到这个数列的规律,每个数都是由前一个数得到的。当前一个数是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

这个测试结果显示,非递归函数的性能要比递归函数快很多。