簡體   English   中英

我的代碼正在使用遞歸產生邏輯錯誤,但我不知道如何解決

[英]My code is producing a logic error with recursion and I don't know how to fix it

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]

該代碼應該執行以下操作:輸入:此函數傳遞定義數字序列的開始(> = 0),停止(> start)和步進(> = 1)值。 輸出:此函數返回相應K序列的列表。 第k個序列為k(n)=(k(n-1)+ k(n-2))^ 2

您在k_comp中混合了分配和相等性

你有:

if n == 1:
   n_new == 1

你應該有:

 if n == 1:
     n_new = 1

單個“ =”表示將右側的值分配給左側的變量。

雙'=='表示左值和右值相等。 在這種情況下,它將不存在,因此不相等,因此為False。 False是有效的python語句; 只是不會做您期望的事情。

您的問題是您的第二個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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM