Python递归类型

Python递归类型,python,recursion,Python,Recursion,我很快就要参加python考试了,当我在解决前几年的考试时,我注意到有时会要求我们编写递归函数我的问题是:我可以使用任何类型的递归吗? 例如,如果给我这个练习: 编写一个递归函数,返回表中偶数位数 给定的论点 在大多数要求使用递归函数的练习中,老师的解答与函数非常相似,即使是occ。是否也会接受偶数occ作为正确答案(我认为会,但我想确定) 谢谢好吧,您在函数中调用函数,所以从技术上讲,它使用递归。我不认为这有什么问题,但你不应该依靠StackOverflow考试得满分 偶数occ\T产生的字节

我很快就要参加python考试了,当我在解决前几年的考试时,我注意到有时会要求我们编写递归函数我的问题是:我可以使用任何类型的递归吗? 例如,如果给我这个练习:

编写一个递归函数,返回表中偶数位数 给定的论点

在大多数要求使用递归函数的练习中,老师的解答与函数非常相似,即使是occ。是否也会接受偶数occ作为正确答案(我认为会,但我想确定)


谢谢

好吧,您在函数中调用函数,所以从技术上讲,它使用递归。我不认为这有什么问题,但你不应该依靠StackOverflow考试得满分

偶数occ\T
产生的字节码似乎较少,但运行速度比
偶数occ\u DO


要分析的代码 结果 偶数
各种类型的递归包括(有一些重叠):

  • 线性递归

  • 尾部递归

  • 二元递归

  • 结构递归

  • 累加递归

  • 生成递归


递归类型是什么意思?此外,我认为你最好向你的教授/TA/…@WillemVanOnsem教授提出这些问题,递归类型我指的是生成递归函数的所有不同方法(线性递归、尾部递归、二进制递归等),我假设每个递归函数都会被接受。如果需要特定类型,则应明确提及。这毕竟是编程;我们必须是explicit.FWIW,对于arg为0,两个版本都返回0;他们应该返回1。不过,即使是occ,也很容易修复
def even_occ_DO(number): #Recursion using delayed operations 
  if number == 0:
    return 0
  else:
    return (1 if number % 2 == 0 else 0) + even_occ_DO(number//10)

def even_occ_T(number): #Tail Recursion
  def aux(number, sum_):
    if number == 0:
        return sum_
    else:
        return aux(number//10, sum_ + (1 if number%2 == 0 else 0))
  return aux(number,0)
import dis
from timeit import timeit

def even_occ_T(number):  # Tail Recursion
    def aux(number, sum_):
        if number == 0:
            return sum_
        else:
            return aux(number // 10, sum_ + (1 if number % 2 == 0 else 0))

    return aux(number, 0)

setup = '''
def even_occ_T(number):  # Tail Recursion
    def aux(number, sum_):
        if number == 0:
            return sum_
        else:
            return aux(number // 10, sum_ + (1 if number % 2 == 0 else 0))
    return aux(number, 0)
'''

print(timeit(stmt='''[even_occ_T(x) for x in range(0, 10)]''', setup=setup))
print('----------------------------------')
print(dis.dis(even_occ_T))


def even_occ_DO(number):  # Recursion using delayed operations
    if number == 0:
        return 0
    else:
        return (1 if number % 2 == 0 else 0) + even_occ_DO(number // 10)

setup = '''
def even_occ_DO(number):  # Recursion using delayed operations
    if number == 0:
        return 0
    else:
        return (1 if number % 2 == 0 else 0) + even_occ_DO(number // 10)
'''


print(timeit(stmt='''[even_occ_DO(x) for x in range(0, 10)]''', setup=setup))
print('----------------------------------')
print(dis.dis(even_occ_DO))
5.360632722783559
----------------------------------
  5           0 LOAD_CLOSURE             0 (aux)
              3 BUILD_TUPLE              1
              6 LOAD_CONST               1 (<code object aux at 0x0000016683C66B70, file "C:/redacted.py", line 5>)
              9 LOAD_CONST               2 ('even_occ_T.<locals>.aux')
             12 MAKE_CLOSURE             0
             15 STORE_DEREF              0 (aux)

 11          18 LOAD_DEREF               0 (aux)
             21 LOAD_FAST                0 (number)
             24 LOAD_CONST               3 (0)
             27 CALL_FUNCTION            2 (2 positional, 0 keyword pair)
             30 RETURN_VALUE
None
3.4531076108028795
----------------------------------
 30           0 LOAD_FAST                0 (number)
              3 LOAD_CONST               1 (0)
              6 COMPARE_OP               2 (==)
              9 POP_JUMP_IF_FALSE       16

 31          12 LOAD_CONST               1 (0)
             15 RETURN_VALUE

 33     >>   16 LOAD_FAST                0 (number)
             19 LOAD_CONST               2 (2)
             22 BINARY_MODULO
             23 LOAD_CONST               1 (0)
             26 COMPARE_OP               2 (==)
             29 POP_JUMP_IF_FALSE       38
             32 LOAD_CONST               3 (1)
             35 JUMP_FORWARD             3 (to 41)
        >>   38 LOAD_CONST               1 (0)
        >>   41 LOAD_GLOBAL              0 (even_occ_DO)
             44 LOAD_FAST                0 (number)
             47 LOAD_CONST               4 (10)
             50 BINARY_FLOOR_DIVIDE
             51 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             54 BINARY_ADD
             55 RETURN_VALUE
             56 LOAD_CONST               0 (None)
             59 RETURN_VALUE
None