def k_comp(n):
n_new = 0
if n == 0:
n_new = 2
if n == 1:
n_new == 1
if n > 1:
n_new = (k_comp(n-1) + k_comp(n-2))**2
return n_new
def Kseq(start, stop, step):
""" (int,int,int) -> list of integers
Kseq(0,6,1)--->
[2, 1, 9, 100, 11881, 143544361]
Kseq(2,6,2)---->
[9, 11881]
"""
final_list = []
append_this = 0
for i in range (start,stop,step):
append_this = k_comp(i)
final_list.append(append_this)
return final_list
print(Kseq(0,6,1))
它输出的不是预期的输出:[2,0,4,4,16,144,16384]
该代码应该执行以下操作: 输入:此函数传递定义数字序列的开始(> = 0),停止(> start)和步进(> = 1)值。 输出:此函数返回相应K序列的列表。 第k个序列是k(n)=(k(n-1)+ k(n-2))^ 2
答案 0 :(得分:1)
您在k_comp中混淆了分配和相等性
您有:
if n == 1:
n_new == 1
您应该具有:
if n == 1:
n_new = 1
单个'='表示将右侧的值分配给左侧的变量。
双精度'=='表示左值和右值相等。在这种情况下,它将不存在,因此不相等,因此为False。 False是有效的python语句;只是不会达到您的期望。
答案 1 :(得分:1)
您的问题是您在if
中遇到的第二个k_comp()
条件,==
是一个相等测试:
if n == 1:
n_new == 1
这留下了n_new = 0
,所以我想你的意思是:
if n == 1:
n_new = 1
进行更改后:
In []:
Kseq(0, 6, 1)
Out[]:
[2, 1, 9, 100, 11881, 143544361]
注意:这会非常低效,因为它会多次计算k_comp(k)
,您只需构造k
的序列即可,例如:
def k_seq():
k = [2, 1]
for _ in range(2, n):
k.append((k[-1] + k[-2])**2)
return k
def Kseq(start, stop, step):
return k_seq(stop)[start::step]
In []
Kseq(0, 6, 1)
Out[]:
[2, 1, 9, 100, 11881, 143544361]
In []:
Kseq(2, 6, 2)
Out[]:
[9, 11881]
时间上的差异:
In []:
%timeit Kseq_recursive(0, 10, 1)
Out[]:
75.8 µs ± 1.28 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In []:
%timeit Kseq_sequence(0, 10, 1)
Out[]:
4.39 µs ± 77.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
或作为发电机
import itertools as it
def k_gen():
kprime, k = 2, 1
yield from (kprime, k)
while True:
kprime, k = k, (kprime + k)**2
yield k
def Kseq(start, stop, step):
return list(it.islice(k_gen(), start, stop, step))
In []:
Kseq(0, 6, 1)
Out[]:
[2, 1, 9, 100, 11881, 143544361]