Is there a way to check if function is recursive in python?

后端 未结 2 1932
无人及你
无人及你 2021-01-13 11:09

I want to write a testing function for an exercise, to make sure a function is implemented correctly.
So I got to wonder, is there a way, given a function \"foo\", to ch

2条回答
  •  醉酒成梦
    2021-01-13 11:23

    I have not yet verified for myself if Alex's answer works (though I assume it does, and far better than what I'm about to propose), but if you want something a little simpler (and smaller) than that, you can simply use sys.getrecursionlimit() to error it out manually, then check for that within a function. For example, this is what I wrote for a recursion verification of my own:

    import sys
    
    def is_recursive(function, *args):
      try:
        # Calls the function with arguments
        function(sys.getrecursionlimit()+1, *args)
      # Catches RecursionError instances (means function is recursive)
      except RecursionError:
        return True
      # Catches everything else (may not mean function isn't recursive,
      # but it means we probably have a bug somewhere else in the code)
      except:
        return False
      # Return False if it didn't error out (means function isn't recursive)
      return False
    

    While it may be less elegant (and more faulty in some instances), this is far smaller than Alex's code and works reasonably well for most instances. The main drawback here is that with this approach, you're making your computer process through every recursion the function goes through until reaching the recursion limit. I suggest temporarily changing the recursion limit with sys.setrecursionlimit() while using this code to minimize the time taken to process through the recursions, like so:

    sys.setrecursionlimit(10)
    if is_recursive(my_func, ...):
      # do stuff
    else:
      # do other stuff
    sys.setrecursionlimit(1000) # 1000 is the default recursion limit
    

提交回复
热议问题