[英]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 開始構建range
並step
計數到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.