Python递归类型
我很快就要参加python考试了,当我在解决前几年的考试时,我注意到有时会要求我们编写递归函数我的问题是:我可以使用任何类型的递归吗? 例如,如果给我这个练习: 编写一个递归函数,返回表中偶数位数 给定的论点 在大多数要求使用递归函数的练习中,老师的解答与函数非常相似,即使是occ。是否也会接受偶数occ作为正确答案(我认为会,但我想确定)Python递归类型,python,recursion,Python,Recursion,我很快就要参加python考试了,当我在解决前几年的考试时,我注意到有时会要求我们编写递归函数我的问题是:我可以使用任何类型的递归吗? 例如,如果给我这个练习: 编写一个递归函数,返回表中偶数位数 给定的论点 在大多数要求使用递归函数的练习中,老师的解答与函数非常相似,即使是occ。是否也会接受偶数occ作为正确答案(我认为会,但我想确定) 谢谢好吧,您在函数中调用函数,所以从技术上讲,它使用递归。我不认为这有什么问题,但你不应该依靠StackOverflow考试得满分 偶数occ\T产生的字节
谢谢好吧,您在函数中调用函数,所以从技术上讲,它使用递归。我不认为这有什么问题,但你不应该依靠StackOverflow考试得满分
偶数occ\T
产生的字节码似乎较少,但运行速度比偶数occ\u DO
要分析的代码 结果 偶数
各种类型的递归包括(有一些重叠):
- 线性递归
- 尾部递归
- 二元递归
- 结构递归
- 累加递归
- 生成递归
。
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