递归函数的装饰器

1 投票
1 回答
54 浏览
提问于 2025-04-13 17:15

我想为递归函数实现一个装饰器,具体来说是斐波那契数列。你知道,递归函数在处理大输入时会花费很多时间。在这个例子中,我尝试了斐波那契数列,但它返回了以下错误:

TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'

如果我不使用装饰器运行代码,它就能正常工作并返回相应的结果,但加上装饰器后就出现了错误。我也会把代码贴出来。

           import time
            # start =time.time()
            def time_calculator(func):
                def n_th_number(n):
                    start = time.time()
            
                    print(func(n))
                    end = time.time()
                    print(f'fibonacci lasts for {end - start} second')
                return n_th_number
            @time_calculator
            def fibonacci(n):
                if n==0 or n==1:
                    return n
                else:
            
                   return fibonacci(n-1)+fibonacci(n-2)
            fibonacci(30)

请帮我理解我的代码哪里出错了?

完整错误信息:

1
fibonacci lasts for 0.0 second
0
fibonacci lasts for 0.0 second
Traceback (most recent call last):
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 16, in <module>
    fibonacci(30)
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ^^^^^^^^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 7, in n_th_number
    print(func(n))
          ^^^^^^^
  File "C:\Users\User\PycharmProjects\New_AI_Era\time_estimation.py", line 15, in fibonacci
    return fibonacci(n-1)+fibonacci(n-2)
           ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'

1 个回答

1

这个包装器还是需要调用那个函数,并且返回它本来会返回的值。

           import time
            # start =time.time()
            def time_calculator(func):
                def n_th_number(n):
                    start = time.time()
                    result = func(n)
                    print(result)
                    end = time.time()
                    print(f'fibonacci lasts for {end - start} second')
                    return result
                return n_th_number

撰写回答