C++程序 查找系列-1、2、11、26、47……的第N个项
什么是该系列?
这个系列其实就是一个递推数列,即每一项都是由前面的项推出来的,公式如下:
a_1 = 1
a_2 = 2
a_n = a_{n-1} + (n-1)^2
因此,该数列的前若干项为:
1, 2, 11, 26, 47, 74, 107, 146, 191, 242, …
怎样编写程序来查找该系列的第N项?
我们可以使用递归或循环来实现此功能。
使用递归
递归是一种函数可以调用自身的方法。在这里,我们可以使用递归来查找该系列的第N项,代码如下:
def recursion(n):
if n == 1:
return 1
elif n == 2:
return 2
else:
return recursion(n-1) + (n-1)**2
print(recursion(6)) # 输出74
上述代码中,我们定义了一个递归函数recursion,它接收n作为参数。如果n小于等于2,则直接返回该项的值。否则,递归调用recursion函数来获取前一项的值,并加上 (n-1)^2 得到当前项的值。
我们可以通过调用recursion函数来获取该系列的第N项。如上代码所示,我们调用recursion(6)来获取该系列的第6项,输出结果为74。
然而,递归随着数据规模的增大,其消耗的时间和空间也将增加。
使用循环
循环是一种重复执行特定任务的结构。在这里,我们可以使用循环来查找该系列的第N项,代码如下:
def loop(n):
if n == 1:
return 1
elif n == 2:
return 2
else:
a, b = 1, 2
for i in range(3, n+1):
c = b + (i-1)**2
a, b = b, c
return c
print(loop(6)) # 输出74
首先,我们同样要先特判前两项。如果n小于等于2,则直接返回该项的值。
否则,我们定义了a=1和b=2作为前两项。从第3项开始,我们通过循环逐个计算得到该系列的第N项的值。
与递归方法不同的是,我们需要一个额外的变量c来存储当前项的值。
最后,我们可以通过调用loop函数来获取该系列的第N项。如上代码所示,我们调用loop(6)来获取该系列的第6项,输出结果为74。
时间复杂度和空间复杂度
使用递归时,程序将不断的调用自己,因此会生成更多的函数调用,导致时间复杂度变高。同时,递归需要维护一个函数调用栈,会使得空间复杂度变高。
而使用循环时,我们只需要一个额外的变量来存储当前项的值,因此空间复杂度较低。与递归方法不同的是,循环方法不会产生额外的函数调用,因此时间复杂度较低。
结论
因此,我们建议使用循环方法来查找该系列的第N项。使用循环方法,我们可以通过较少的时间和空间复杂度来获取该系列的第N项的值。