簡體   English   中英

將for循環轉換為遞歸函數

[英]Convert a for-loop to a recursive function

任何人都可以幫助將其轉換為遞歸函數嗎?

def max_vel(t):
    vel = 0   
    thr = 10
    c = -0.1
    for i in range(t):
        fric = c * vel
        acc = thr + fric
        vel = vel + acc
        print fric, acc, vel
    print vel
    return vel
print max_vel(154)

一種相當簡單的方法:

def max_vel(t, vel=[0], thr=10):
    c = -0.1
    if t > 0:
        fric = c * vel[0]
        acc = thr + fric
        vel[0] = vel[0] + acc
        print fric, acc, vel
        max_vel(t - 1, vel, thr)
    return vel[0]

在這里,您只需遞減t ,因為這是迭代次數。 c永遠不會更改,因此不會在遞歸中傳遞它。 現在,我將vel用作1個元素的列表,因為在Python中,列表是可變的:這允許通過遞歸調用來更新vel內容。

為了解決遞歸問題,需要以遞歸的方式陳述該問題。 這意味着以自相似的方式定義它。

在這種情況下,存在變量:時間,加速度和速度。 因此,主要問題必須由具有相同變量的子問題來定義。 我們可以使用2個(非常相似)的問題:

  • 從開始起t秒后的加速度和速度是多少。
  • 如果我們給出了加速度和速度,那么t秒后的加速度和速度將是多少。

因此,有兩個(類似)遞歸解決方案:

def start_av(t):
  if t == 0: return 0, 0
  acc, vel = start_av(t-1)
  thr = 10
  c = -0.1
  fric = c*vel
  acc = thr + fric
  return (acc, vel + acc)

def given_av(t, acc=0, vel=0):
  if t == 0: return acc, vel
  thr = 10
  c = -0.1
  fric = c*vel
  acc = thr + fric
  return given_av(t-1, acc, vel + acc)    

print start_av(10)
print given_av(10)

暫無
暫無

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

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