【问题标题】:My code is producing a logic error with recursion and I don't know how to fix it我的代码通过递归产生逻辑错误,我不知道如何修复它
【发布时间】:2019-03-20 01:29:26
【问题描述】:
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, 16, 144, 16384]

代码应该这样做: 输入:此函数传递定义数字序列的 start (>= 0)、stop (>start) 和 step (>= 1) 值。 输出:此函数返回相应 K 序列的列表。 k序列为k(n) = (k(n-1) + k(n-2))^2

【问题讨论】:

  • 请修正你的缩进。
  • 犯了逻辑错误,而不是你的程序:D

标签: python recursion compiler-errors logic


【解决方案1】:

您在 k_comp 中混淆了赋值和相等性

你有:

if n == 1:
   n_new == 1

你应该有:

 if n == 1:
     n_new = 1

单个'='表示将右侧的值赋给左侧的变量。

双'=='表示左值与右值相等。在这种情况下,它将不等于不相等,因此为 False。 False 是一个有效的 python 语句;它只是不会做你所期望的。

【讨论】:

    【解决方案2】:

    您的问题在于k_comp() 中的第二个if 条件,== 是一个相等测试:

    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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      相关资源
      最近更新 更多