2011-07-02 36 views
1

我试图实现一个递归的斐波那契数列,它返回索引处的值。这是一项家庭作业,需要使用多线程来完成。这是我迄今为止所做的。我的问题是如何添加live_thread1live_thread2的结果。线程必须在递归的每个级别创建。在python中创建递归线程

def Recursive(n): 
    if n< 2: 
     return n 
    else: 
     return Recursive(n- 1) + Recursive(n- 2) 



def FibonacciThreads(n): 
    if n< 2: 
     return n 
    else: 
     thread1  = threading.Thread(target=FibonacciThreads,args=(n-1,)) 
     thread2  = threading.Thread(target=FibonacciThreads,args=(n-2,)) 
     thread1.start() 
     thread2.start() 
     thread1.join() 
     thread2.join() 
     return live_thread1+live_thread2 
+0

这是一个非常奇怪的任务。为什么你要开始一个新的线程什么也不做,而是开始一个新的线程(或两个)? –

+0

你说这是作业,所以你必须这样做。但是创建一个线程会产生开销。这段代码会让__lots__的线程做很少的工作。我认为这不是一个好主意,可以用真实代码来实现。 – unholysampler

+0

这是疯狂的,使用线程的指数算法?哦,我的上帝.... – TMS

回答

1

您可以将可变对象传递给线程以用于存储结果。如果您不想引入新的数据类型,则可以使用单个元素列表:

def fib(n, r): 
    if n < 2: 
     r[0] = n 
    else: 
     r1 = [None] 
     r2 = [None] 
     # Start fib() threads that use r1 and r2 for results. 
     ... 

     # Sum the results of the threads. 
     r[0] = r1[0] + r2[0] 

def FibonacciThreads(n): 
    r = [None] 
    fib(n, r) 
    return r[0] 
4

这是不可能的,因为你不能检索在另一个线程中执行的函数的返回值。

要实现你想要的行为,你必须做出FibonacciThreads存储结果作为一个成员变量调用对象:

class FibonacciThreads(object): 
    def __init__(self): 
     self.result = None 

    def __call__(self, n): 
     # implement logic here as above 
     # instead of a return, store the result in self.result 

你可以使用这个类的实例类似的功能:

fib = FibonacciThreads() # create instance 
fib(23) # calculate the number 
print fib.result # retrieve the result 

请注意,正如我在我的评论中所说,这不是一个非常聪明的线程使用。如果这真的是你的任务,这是一个糟糕的。