问题描述
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)
它不起作用,第一个函数会给我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:更多说明:该函数计算 (n-1)!,但有步骤。 step 参数只会“跳过”或“跳过”一些数字(例如:function1(12,3)
应该计算 1*4*7*10
,就像 range() 中的 step 参数一样,因为它在第一个函数中使用)
谢谢!
解决方法
明显的区别是您从 1 开始构建 range
并按 n
向上 计数到 step
,并且在递归示例中您开始在n
,按step
向下计数。这将导致不同的数字相乘。
因为你不需要使用任何额外的函数参数,我建议使用内部辅助函数,loop
-
def fact (n,step):
def loop (m):
if m >= n:
return 1
else:
return m * loop(m + step)
return loop(1)
如果你不想使用像上面的 loop
这样的辅助函数,你就会被限制在复数模数运算中 -
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)
一旦像“不使用附加参数”这样的学术限制消失了,你可以用更熟悉的方式乘以升序-
def fact (n,step,m = 1):
if m >= n:
return 1
else:
return m * fact(n,m + step)
以上 fact
的所有变体产生相同的输出 -
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,3) == 4) # True
,
因为步数是从 1 开始计算的 你必须在开始之前将 n 归一化为步数加 1 的倍数 您可以通过将递归调用的步数设置为负数来欺骗参数的数量。
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)