簡體   English   中英

如何將 2**n - 1 寫為遞歸 function?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM