Recursive function defined within function => NameError

Thomas A. Bryan tbryan at python.net
Thu Feb 17 06:30:37 EST 2000


Michael Ströder wrote:
> 
> HI!
> 
> I have a problem with a locally-defined recursive function within a
> function. Example:
> 
> ---------------
> def func1():
> 
>   def fak(n):
>     if n>1:
>       return n*fak(n-1)
>     else:
>       return n
> 
>   print fak(6)
> 
> func1()
> ---------------
> 
> But this code snippet does not work. It produces the traceback:
> 
> Traceback (innermost last):
>   File "test/rec-func.py", line 15, in ?
>     func1()
>   File "test/rec-func.py", line 9, in func1
>     print fak(6)
>   File "test/rec-func.py", line 5, in fak
>     return n*fak(n-1)
> NameError: fak
> 
> Can anybody clarify the issue here? I looked in the Language
> Reference and found the hint
> 
> ---------------
> Programmer's note: a ``def'' form executed inside a function
> definition defines a local function that can be returned or passed
> around. Because of Python's two-scope philosophy, a local function
> defined in this way does not have access to the local variables of
> the function that contains its definition;
> ---------------
> 
> I applied the standard trick showed there to my example and the
> following code works:
> 
> ---------------
> def func1():
> 
>   def fak(n,fak):
>     if n>1:
>       return n*fak(n-1,fak)
>     else:
>       return n
> 
>   print fak(6,fak)
> 
> func1()
> ---------------
> 
> Any better solution?

Better in what sense?  This works, but I'm not sure whether it's 
useful.  

class Recursive:
  """A base class for recursive function objects"""
  def _func(self,n):
    """subclasses should override this method"""
    pass  
  def __call__(self, n):
    """This method calls the instance's function."""
    return self._func(n)

class Fak(Recursive):
  """A recursive implementation of factorial."""
  def _func(self,n):
    if n>1:
      return n * self._func(n-1)
    else:
      return n

>>> f = Fak()
>>> f(6)
720


RuntimeError:-Maximum-recursion-depth-exceeded-ly yours
---Tom



More information about the Python-list mailing list