如何使此阶乘函数递归?

耶尔森

计算(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参数一样进行计算,因为它会在第一个函数中使用)

谢谢!

谢谢

最明显的区别是,你正在构建range从1开始计数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)
  elif n < step:
    return 1
  else:
    return (n - step) * fact(n - step, step)

一旦像“不使用其他参数”这样的学术约束消失了,您就可以以更熟悉的方式乘以升序级数-

def fact (n, step, m = 1):
  if m >= n:
    return 1
  else:
    return m * fact(n, step, 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, 2) == 3) # True
print(fact(5, 3) == 4) # True

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python递归阶乘函数

来自分类Dev

如何停止此递归函数?

来自分类Dev

如何在Ruby中编写递归阶乘函数?

来自分类Dev

递归函数-阶乘解中的计数如何存储?

来自分类Dev

Python中的递归(阶乘函数)

来自分类Dev

C递归函数计算阶乘

来自分类Dev

如何递归计算阶乘的阶乘?

来自分类Dev

如何编写此递归Haskell函数

来自分类Dev

此递归函数如何更改“历史”变量?

来自分类Dev

如何编写此迭代函数以递归?

来自分类Dev

此递归函数如何返回正确答案?

来自分类Dev

了解NASM组装中的递归阶乘函数

来自分类Dev

递归函数计算组合和阶乘

来自分类Dev

递归阶乘函数无法正常工作

来自分类Dev

Scala中的尾递归阶乘函数

来自分类Dev

了解NASM组装中的递归阶乘函数

来自分类Dev

递归函数来计算组合和阶乘

来自分类Dev

阶乘递归

来自分类Dev

此递归函数的意义

来自分类Dev

如何在Swift中编写此递归函数?

来自分类Dev

如何使此递归函数更有效?

来自分类Dev

此递归数组置换函数如何在后台运行?

来自分类Dev

如何以非递归形式重写此函数?

来自分类Dev

谁能告诉我此函数的递归部分如何工作?

来自分类Dev

如何摆脱此递归Scheme函数产生的#<void>?

来自分类Dev

您如何利用Swift功能来重构此递归函数?

来自分类Dev

为什么这个阶乘递归函数效率低下?

来自分类Dev

带记忆的F#中的递归阶乘函数

来自分类Dev

实现递归函数时的堆栈溢出错误(阶乘)