意乱情迷 发表于 2021-5-20 03:38:22

为什么递归功能消耗的处理时间比循环多?

为什么递归功能消耗更多的处理时间比循环?
而且,对于处理器来说,这是否繁琐?
def fibonacci(n):
    if n == 0:
      return 0
    elif n == 1:
      return 1
    else:
      return fibonacci(n-1) + fibonacci(n-2)

print fibonacci(40)这个例子需要大约1分钟,但循环只有几毫秒

北京土人 发表于 2021-5-23 06:46:37

如果向它添加了一个备忘录缓存,它将快速完成。

他来自江湖 发表于 2021-5-26 06:53:51

我运行此代码
def fib(n):
    fib.count += 1
    if n < 2:
      return 1
    else:
      return fib(n-2) + fib(n-1)

fib.count = 0
print(fib(40))
print(fib.count)然后我运行此代码,使用字典保存和重复使用部分结果:def fib(n):
    fib.count += 1
    a = partial_results.get(n, None)
    if a is None:
      a = fib(n-2) + fib(n-1)
      partial_results = a
    return a

partial_results = {0:0, 1:1}
fib.count = 0
print(fib(40))
print(fib.count)这类似于 Python 使用缓存为您所做的,但扩展了,以便您可以看到该机制。结果是相同的,但纤维功能只被称为79次。如果我要计算多个斐波纳契数字,其中许多可以通过单个调用fib来计算。
因此,原始递归需要更长的时间,因为它正在做一个荒谬的功能调用计算相同的结果一遍又一
遍。

雪在烧 发表于 2021-5-27 08:02:03

从一个非常简单的情况下开始:
fib = fib +
fib fib = (fib = fib + fib ) =
(fib = fib = fib fib = (fib = (fib = fib
= fib ) = fib ) = (fib = fib = fib ) 这是 9 个调用 fib ()。
此代码记录了每个值 n 的调用
次数:calls = {}

def fib(n):
    calls = calls.get(n, 0) + 1
    if n < 2:
      return 1
    else:
      return fib(n-1) + fib(n-2)
fib(5)
for n, count in calls.items():
    print(f'{n:3d} : {count:5d}')
print('Total', sum(calls.values()))

珍惜相遇 发表于 2021-5-31 11:07:07

我想你的循环写得不完全一样。
递归表示功能调用。功能调用将需要更多的时间和内存,而不仅仅是执行一个循环。但差别并不大。
但是你的程序写的方式,你重写你的工作一遍又一
遍。我猜你的循环不是用那种方式写的缓慢性是由于算法,而不是本质上的递归。
如果向它添加了一个备忘录缓存,它将快速完成。from functools import lru_cache

@lru_cache
def fibonacci(n):
    if n == 0:
      return 0
    elif n == 1:
      return 1
    else:
      return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(40))
页: [1]
查看完整版本: 为什么递归功能消耗的处理时间比循环多?