微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我怎样才能使这个阶乘函数递归?

如何解决我怎样才能使这个阶乘函数递归?

一个计算(n-1)的函数! ,但有步骤。

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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。