Python 中的指数递归
Recursion in Python with exponents
作为练习,我必须完成演示 python 中递归的代码。
我得到了代码并被告知要完成它,例如,4^2 = 16
def raise_to_power(base_val, exponent_val):
if exponent_val == 0:
result_val = 1
else:
result_val = base_val * #start entering code here
return result_val
user_base = 4
user_exponent = 2
print('%d^%d = %d' % (user_base, user_exponent,
raise_to_power(user_base, user_exponent)))
我知道他们要我做什么,但我不知道如何表达。我试着做 base_val ** exponent_val,但它说语法无效。它还说不要使用 math.pow() 函数。
谁能帮我理解一下?我发现很难获得递归。
将函数更改为:
def raise_to_power(base_val, exponent_val):
return base_val * raise_to_power(base_val, exponent_val - 1) if exponent_val else 1
在递归函数中,您必须从函数体内再次调用函数并设置一个或多个条件来中断函数的递归调用。
为了更好的理解你可以使用dis.dis
通过反汇编看CPython字节码的分析:
>>> dis.dis(raise_to_power)
2 0 LOAD_FAST 1 (exponent_val)
3 POP_JUMP_IF_FALSE 27
6 LOAD_FAST 0 (base_val)
9 LOAD_GLOBAL 0 (raise_to_power)
12 LOAD_FAST 0 (base_val)
15 LOAD_FAST 1 (exponent_val)
18 LOAD_CONST 1 (1)
21 BINARY_SUBTRACT
22 CALL_FUNCTION 2
25 BINARY_MULTIPLY
26 RETURN_VALUE
>> 27 LOAD_CONST 1 (1)
30 RETURN_VALUE
只需简单修改您的代码即可。它看起来像你的代码。
def raise_to_power(base_val, exponent_val):
if exponent_val == 0:
return 1
else:
return base_val * raise_to_power(base_val, exponent_val-1)
user_base = 4
user_exponent = 2
print('%d^%d = %d' % (user_base, user_exponent,
raise_to_power(user_base, user_exponent)))
递归函数:
递归是一种编程问题的方法,其中函数在其主体中调用自身一次或多次。通常,它是 returning 这个函数调用的 return 值。 Link
通过递归调用将数字从 5 添加到 0 的简单示例:
代码:
def addNumbers(n):
print "Debug 1: n=%d"%(n)
if n==0:
print "Debug 2: n=%d"%(n)
return 0
else:
print "Debug 3: n=%d"%(n)
ans = n + addNumbers(n-1)
print "Debug 4: n=%d, ans=%d"%(n, ans)
return ans
add_nos = addNumbers(5)
print "\nFinal Addition:", add_nos
输出:
$ python 4.py
Debug 1: n=5
Debug 3: n=5
Debug 1: n=4
Debug 3: n=4
Debug 1: n=3
Debug 3: n=3
Debug 1: n=2
Debug 3: n=2
Debug 1: n=1
Debug 3: n=1
Debug 1: n=0
Debug 2: n=0
Debug 4: n=1, ans=1
Debug 4: n=2, ans=3
Debug 4: n=3, ans=6
Debug 4: n=4, ans=10
Debug 4: n=5, ans=15
Final Addition: 15
作为练习,我必须完成演示 python 中递归的代码。
我得到了代码并被告知要完成它,例如,4^2 = 16
def raise_to_power(base_val, exponent_val):
if exponent_val == 0:
result_val = 1
else:
result_val = base_val * #start entering code here
return result_val
user_base = 4
user_exponent = 2
print('%d^%d = %d' % (user_base, user_exponent,
raise_to_power(user_base, user_exponent)))
我知道他们要我做什么,但我不知道如何表达。我试着做 base_val ** exponent_val,但它说语法无效。它还说不要使用 math.pow() 函数。
谁能帮我理解一下?我发现很难获得递归。
将函数更改为:
def raise_to_power(base_val, exponent_val):
return base_val * raise_to_power(base_val, exponent_val - 1) if exponent_val else 1
在递归函数中,您必须从函数体内再次调用函数并设置一个或多个条件来中断函数的递归调用。
为了更好的理解你可以使用dis.dis
通过反汇编看CPython字节码的分析:
>>> dis.dis(raise_to_power)
2 0 LOAD_FAST 1 (exponent_val)
3 POP_JUMP_IF_FALSE 27
6 LOAD_FAST 0 (base_val)
9 LOAD_GLOBAL 0 (raise_to_power)
12 LOAD_FAST 0 (base_val)
15 LOAD_FAST 1 (exponent_val)
18 LOAD_CONST 1 (1)
21 BINARY_SUBTRACT
22 CALL_FUNCTION 2
25 BINARY_MULTIPLY
26 RETURN_VALUE
>> 27 LOAD_CONST 1 (1)
30 RETURN_VALUE
只需简单修改您的代码即可。它看起来像你的代码。
def raise_to_power(base_val, exponent_val):
if exponent_val == 0:
return 1
else:
return base_val * raise_to_power(base_val, exponent_val-1)
user_base = 4
user_exponent = 2
print('%d^%d = %d' % (user_base, user_exponent,
raise_to_power(user_base, user_exponent)))
递归函数:
递归是一种编程问题的方法,其中函数在其主体中调用自身一次或多次。通常,它是 returning 这个函数调用的 return 值。 Link
通过递归调用将数字从 5 添加到 0 的简单示例:
代码:
def addNumbers(n):
print "Debug 1: n=%d"%(n)
if n==0:
print "Debug 2: n=%d"%(n)
return 0
else:
print "Debug 3: n=%d"%(n)
ans = n + addNumbers(n-1)
print "Debug 4: n=%d, ans=%d"%(n, ans)
return ans
add_nos = addNumbers(5)
print "\nFinal Addition:", add_nos
输出:
$ python 4.py
Debug 1: n=5
Debug 3: n=5
Debug 1: n=4
Debug 3: n=4
Debug 1: n=3
Debug 3: n=3
Debug 1: n=2
Debug 3: n=2
Debug 1: n=1
Debug 3: n=1
Debug 1: n=0
Debug 2: n=0
Debug 4: n=1, ans=1
Debug 4: n=2, ans=3
Debug 4: n=3, ans=6
Debug 4: n=4, ans=10
Debug 4: n=5, ans=15
Final Addition: 15