[英]How to write 2**n - 1 as a recursive function?
我需要一個接受 n 並返回2 n - 1的 function 。 聽起來很簡單,但是 function 必須是遞歸的。 到目前為止,我只有 2 n :
def required_steps(n):
if n == 0:
return 1
return 2 * req_steps(n-1)
練習狀態:“您可以假設參數 n 始終為正 integer 並且大於 0”
要使用遞歸方法解決問題,您必須了解如何使用給定的輸入定義 function,以使用不同的輸入來定義相同的 function。 在這種情況下,由於f(n) = 2 * f(n - 1) + 1
,您可以這樣做:
def required_steps(n):
return n and 2 * required_steps(n - 1) + 1
以便:
for i in range(5):
print(required_steps(i))
輸出:
0
1
3
7
15
2**n -1
也是1+2+4+...+2 n-1 ,它可以構成一個遞歸 function (沒有第二個從 2 的冪中減去 1)。
提示:1+2*(1+2*(...))
解決方法如下,先不要看是否要嘗試提示。
如果保證n
大於零(正如問題陳述中實際承諾的那樣),則此方法有效:
def required_steps(n):
if n == 1: # changed because we need one less going down
return 1
return 1 + 2 * required_steps(n-1)
更強大的版本也可以處理零值和負值:
def required_steps(n):
if n < 0:
raise ValueError("n must be non-negative")
if n == 0:
return 0
return 1 + 2 * required_steps(n-1)
(添加非整數檢查留作練習。)
您可以將真正遞歸的部分提取到另一個 function
def f(n):
return required_steps(n) - 1
或者您可以設置一個標志並定義何時減去
def required_steps(n, sub=True):
if n == 0: return 1
return 2 * required_steps(n-1, False) - sub
>>> print(required_steps(10))
1023
有一個占位符來記住 n 的原始值,然后在第一步,即n == N
,返回2^n-1
n = 10
# constant to hold initial value of n
N = n
def required_steps(n, N):
if n == 0:
return 1
elif n == N:
return 2 * required_steps(n-1, N) - 1
return 2 * required_steps(n-1, N)
required_steps(n, N)
對結果使用附加參數r
-
def required_steps (n = 0, r = 1):
if n == 0:
return r - 1
else:
return required_steps(n - 1, r * 2)
for x in range(6):
print(f"f({x}) = {required_steps(x)}")
# f(0) = 0
# f(1) = 1
# f(2) = 3
# f(3) = 7
# f(4) = 15
# f(5) = 31
您也可以使用按位左移來編寫它, <<
-
def required_steps (n = 0, r = 1):
if n == 0:
return r - 1
else:
return required_steps(n - 1, r << 1)
output是一樣的
獲得“-1”偏移量的一種方法是將其應用到第一個 function 調用的返回中,使用具有默認值的參數,然后在遞歸調用期間將偏移量參數顯式設置為零。
def required_steps(n, offset = -1):
if n == 0:
return 1
return offset + 2 * required_steps(n-1,0)
除了前面給出的所有很棒的答案之外,下面將展示其內部函數的實現。
def outer(n):
k=n
def p(n):
if n==1:
return 2
if n==k:
return 2*p(n-1)-1
return 2*p(n-1)
return p(n)
n=5
print(outer(n))
基本上,它將全局值 n 分配給 k 並通過適當的比較遞歸它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.