如何在python中构建递归函数?

如何在python中构建递归函数?,python,recursion,Python,Recursion,如何用python构建递归函数?我想知道您的意思是“递归”吗。下面是一个简单的递归函数示例,用于计算: 递归算法的两个关键要素是: 终止条件:n==0 函数每次用较小的数字调用自身的缩减步骤:factorial(n-1) 假设您想要构建: u(n+1)=f(u(n)),其中u(0)=u0 一种解决方案是定义一个简单的递归函数: u0 = ... def f(x): ... def u(n): if n==0: return u0 return f(u(n-1)) 不幸的是,如

如何用python构建递归函数?

我想知道您的意思是“递归”吗。下面是一个简单的递归函数示例,用于计算:

递归算法的两个关键要素是:

  • 终止条件:
    n==0
  • 函数每次用较小的数字调用自身的缩减步骤:
    factorial(n-1)

假设您想要构建: u(n+1)=f(u(n)),其中u(0)=u0

一种解决方案是定义一个简单的递归函数:

u0 = ...

def f(x):
  ...

def u(n):
  if n==0: return u0
  return f(u(n-1))
不幸的是,如果要计算u的高值,将遇到堆栈溢出错误

另一种解决方案是简单循环:

def u(n):
  ux = u0
  for i in xrange(n):
    ux=f(ux)
  return ux
但是,如果您想要多个u值来表示不同的n值,这是次优的。您可以缓存数组中的所有值,但可能会遇到内存不足错误。您可能希望改用生成器:

def u(n):
  ux = u0
  for i in xrange(n):
    ux=f(ux)
  yield ux

for val in u(1000):
  print val

还有许多其他选项,但我想这些是主要的。

递归函数示例:

def recursive(string, num):
    print "#%s - %s" % (string, num)
    recursive(string, num+1)
使用以下命令运行它:

recursive("Hello world", 0)

Python中的递归与其他语言中的递归一样,递归构造是根据自身定义的:

例如,递归类可以是二叉树(或任何树):

要设置它:

import sys #(if you haven't already)
sys.setrecursionlimit()

编辑:我不能保证我的二叉树是有史以来最有效的设计。如果有人能改进它,我很高兴听到递归是如何实现的。原来的问题是“递归的”,而不是“递归的”,因此我的答案,现在这个问题已经被修改了,这没有多大意义。有趣的答案,但我不明白最后一个例子的要点A旁注:不是所有的函数都必须停下来才有用。例如,itertools.count()。顺便说一句,它可以递归实现。我这里有一个查询。如果我让一个函数做乘法,如果n是偶数,另一个是奇数,会发生什么。这些函数显然是相互调用的
def偶数(n):返回n*奇数(n-1)def奇数(n):如果n==1:返回1否则:返回n*偶数(n-1)
假设我最初可以调用正确的偶数或奇数函数,会发生什么情况?@Ayos:假设您的函数实现正确,也可以正常工作。这种情况称为相互递归函数。@GregHewgill我似乎因为超过最大递归深度而出现运行时错误,尽管我知道它不是无限递归。但这些条件都不是函数递归所必需的。此递归例程如何结束/退出?正确。即使我很好奇,这将如何结束?据我所知,每个递归中都应该有一个平凡的语句。它将以
运行时错误结束:超过了最大递归深度,因为没有任何语句会限制递归深度。最大递归深度可以由代码检查<代码>导入系统;sys.getrecursionlimit()
。在我的系统上是1000。所以这将运行1000次,然后停止。递归应该有两个条件:退出条件和递增或递减。
class tree():
    def __init__(self):
        '''Initialise the tree'''
        self.Data = None
        self.Count = 0
        self.LeftSubtree = None
        self.RightSubtree = None

    def Insert(self, data):
        '''Add an item of data to the tree'''
        if self.Data == None:
            self.Data = data
            self.Count += 1
        elif data < self.Data:
            if self.LeftSubtree == None:
                # tree is a recurive class definition
                self.LeftSubtree = tree()
            # Insert is a recursive function
            self.LeftSubtree.Insert(data)
        elif data == self.Data:
            self.Count += 1
        elif data > self.Data:
            if self.RightSubtree == None:
                self.RightSubtree = tree()
            self.RightSubtree.Insert(data)

if __name__ == '__main__':
    T = tree()
    # The root node
    T.Insert('b')
    # Will be put into the left subtree
    T.Insert('a')
    # Will be put into the right subtree
    T.Insert('c')
import sys
sys.getrecursionlimit()
import sys #(if you haven't already)
sys.setrecursionlimit()