簡體   English   中英

我怎樣才能使這個階乘 function 遞歸?

[英]How can i make this factorial function recursive?

計算 (n-1), 的 function。 但有步驟。

def function1(n, step):
    result = 1
    for i in range(1, n, step):
        result *= i

    return result

我不允許添加更多參數,我需要使其遞歸。 我試過這個:

def function2(n, step):
    if n < 0:
        return 1

    return n * function2(n-step, step)

但是讓我們說:

function2(6,3)

它行不通,第一個 function 會給我1 * 4 ,第二個會給我6 * 3 * 1

我不知道如何使它與 step 參數一起工作。

編輯:更多示例:

First function
function1(13, 3) == 280
function1(11, 3) == 280
function1(6, 3) == 4
function1(11, 2) == 945
function1(8, 2) == 105
function1(4, 2) == 3
More sample: 
function1(12, 3) == 280
function1(5, 2) == 3
function1(5, 3) == 4

Second function (same values):
function2(13, 3) == 3640
function2(11, 3) == 880
function2(6, 3) == 0
function2(11, 2) == 10395
function2(8, 2) == 0
function2(4, 2) == 0

Edit2:更多說明:function 計算(n-1)。 但有步驟。 step 參數只會“跳過”或“跳過”一些數字(例如:: function1(12, 3)應該計算1*4*7*10 ,就像 range() 中的 step 參數一樣,因為它用於第一個功能)

謝謝!

明顯的區別是您從 1 開始構建rangestep計數n ,而在遞歸示例中,您從n開始並step倒數 這將導致不同的數字相乘。

因為您不需要使用任何額外的 function 參數,所以我建議使用內部助手 function, loop -

def fact (n, step):
  def loop (m):
    if m >= n:
      return 1
    else:
      return m * loop(m + step)
  return loop(1)

如果您不想像上面的loop那樣使用幫助程序 function,那么您將受限於復模運算 -

def fact (n, step):
  if n % step != 1:
    return fact(n + 1, step)
  elif n < step:
    return 1
  else:
    return (n - step) * fact(n - step, step)

無論你用哪種方式搖晃它,這個問題的取模運算都是混亂的——

def fact (n, step):
  q = (n - 1) % step
  if q:
    return fact(n + step - q, step)
  elif n < step:
    return 1
  else:
    return (n - step) * fact(n - step, step)

一旦諸如“不使用附加參數” go 之類的學術約束消失,您可以以更熟悉的方式將升序相乘 -

def fact (n, step, m = 1):
  if m >= n:
    return 1
  else:
    return m * fact(n, step, m + step)

上述fact的所有變體都會產生相同的 output -

print(fact(13, 3) == 280) # True
print(fact(11, 3) == 280) # True
print(fact(6, 3) == 4) # True
print(fact(11, 2) == 945) # True
print(fact(8, 2) == 105) # True
print(fact(4, 2) == 3) # True
print(fact(5, 2) == 3) # True
print(fact(5, 3) == 4) # True

因為步驟是從 1 開始計算的,所以您必須在開始之前將 n 標准化為 step 加 1 的倍數並且您可以通過在遞歸調用中將步驟設置為負數來欺騙 arguments 的數量。

def function2(n, step):
    if n <= 1:
        return 1
    if step > 0: 
        n = n - 2
        n = n - n % step + 1
        step = -step
    return n * function2(n + step, step)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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