python:将调用自身的函数

时间:2010-08-05 16:19:21

标签: python

我想知道我是否可以通过需要自行调用的函数的stucture.logic获得帮助

def populate_frequency5(d,data,total_compare):
  freq=[]
  prev = None
  for row in d:
    if prev is None or prev==row[11]:
      freq.append(row[16])
      doctor=row[10]
      drug=row[11][:row[11].find(' ')].capitalize()
    else:
      make_image_url_doctor(freq,doctor,drug,data)
      total_compare=True
      del freq[:]
    prev=row[11]  
  if total_compare:
    (b1,bla,bla1)=medications_subset2(data,[drug.upper()])
    data1=calculate_creat_conc4(b1)
    populate_frequency5(data1,['a'],total_compare=True)
    total_compare=False
  1. 第一次调用该函数时我需要它来运行它:

    def populate_frequency5(d,data,total_compare):
      freq=[]
      prev = None
      for row in d:
        if prev is None or prev==row[11]:
          freq.append(row[16])
          doctor=row[10]
          drug=row[11][:row[11].find(' ')].capitalize()
        else:
          make_image_url_doctor(freq,doctor,drug,data)
          (b1,bla,bla1)=medications_subset2(data,[drug.upper()])
          data1=calculate_creat_conc4(b1)
          del freq[:]
        prev=row[11]
    
  2. 然后不知怎的第二次,当我打电话给它时,我需要它以这种方式运行:

    def populate_frequency5(d,data,total_compare):
     freq=[]
     prev = None
     for row in d:
       if prev is None or prev==row[11]:
         freq.append(row[16])
         doctor=row[10]
         drug=row[11][:row[11].find(' ')].capitalize()
     run_another_function()
    

1 个答案:

答案 0 :(得分:1)

您当前的逻辑错误并导致失控的递归。如果您进行了递归调用,则会将total_compare传递给True;但是在那个递归调用中它不再被设置为False,所以当被检查时它将是真的,并且将不可避免地导致另一个递归调用(具有相同的缺陷)。

调用实例中的total_compare的设置(它是否曾执行,由于失控的递归而不会这样)是无关紧要的:它是在那里执行的最后一个语句,它设置了一个局部变量,所以当然可以删除它而没有任何可观察到的影响。也许你没有意识到递归调用中函数的每个实例都有自己的一组局部变量(包括参数 - 它们也是局部变量,只是调用者获得初始化器的那些),这就是为什么我是明确指出这一点。

您的示例“所需代码”1和2并没有真正帮助,因为它们从不显示调用自身的函数。在什么条件下,确切地说,函数需要以递归方式调用自身(a)如果它是非递归调用的,(b)它是否已经递归调用?请记住,为了避免失控的递归,必须最终会达到“基本情况”,不再发生进一步的递归。

鉴于在你的第一个(“失控递归”)示例中,递归调用似乎是调用者的最后一个操作(除了total_compare局部变量的无用且因此可移除的设置),我还应该指出这样的“尾递归”很容易变成迭代(并且在Python中,这通常是可取的,因为Python不像其他语言那样优化尾递归)。