递归python调用不会验证所有选项

时间:2019-02-07 13:56:08

标签: python recursion

  

构建一个递归函数,以验证每个函数   i<len(lis)/2 : lis[i]+lis[len(lis)-i-1] = x

def controlTest(list,x):
#@param list: list of integers
#@param x: integer
#@return: bool
 for i in range(0,len(list)/2):
  if list[i]+list[len(list)-i-1]==x:  
   return controlTest(list[1:len(list)-1],x)
  else:
   return list 

我希望此函数的输出为一个empy列表[],但是for循环会跳过递归调用的步骤

  

示例:如果list= [1, 5, 3, 6, 4, 8]x = 9,则函数返回空列表[],因为1 + 8 = 5 + 4 = 3 + 6   = 9

2 个答案:

答案 0 :(得分:2)

假设您要返回列表的不满足此条件的内部部分,则可以进行以下操作:

def controlTest(l, x):
    if len(l) < 2:
        return []  # base case
    elif l[0] + l[-1] != x:
        return l  # failure
    else:
        return controlTest(l[1:-1], x) # recursion 

这可以更简短一些,但是我扩展了定义以强调缺少的元素。在递归函数中,通常不需要循环,因为递归本身提供了循环效果。

  • 首先,我们提供了一个基本案例,可以说它“打破了循环”,其中遍历了列表的一半。
  • 第二,我们提供失败案例的返回值,该返回值不是我们要测试的结果,然后将其从递归调用中传播到调用堆栈中
  • 接下来,如果条件满足列表的内部部分,我们将进行递归。

这返回了我认为该问题的预期结果:

>>> controlTest([1,5,3,6,4,8], 9)
[]
>>> controlTest([1,5,4,6,4,8], 9)
[4, 6]

答案 1 :(得分:0)

问题是,如果输入数组的长度为0,则for循环永远不会运行,因此您没有return语句。这样,如果检查成功,则最后一个递归调用将在空数组上运行,并且不返回任何内容,因此您将得到None的答案。

我还必须在此行上将一个强制类型转换为int

len(list)/2 -> int(len(list)/2)

使代码运行。

您可以只在如下所示的for循环之外的末尾添加一个额外的return,或者可以检查空数组。

def controlTest(list,x):
#@param list: list of integers
#@param x: integer
#@return: bool
    for i in range(0,int(len(list)/2)):
        if list[i]+list[len(list)-i-1]==x:
            return controlTest(list[1:len(list)-1],x)
        else:
            return list
    return []