我怎样才能写出 SymPy 的 Collatz 猜想?

How can I write Collatz conjecture by SymPy?

提问人:user1488065 提问时间:1/22/2023 更新时间:1/22/2023 访问量:44

问:

我打算编写一个 SymPy 函数,它接受一个自然数并返回 arg 的 Collatz 猜想的步长。Python 版本在这里:

def collatz(n: int):
    step = 0
    while n != 1:
        n = n // 2 if n % 2 == 0 else 3 * n + 1
        step += 1
    return step

print(collatz(27))

它打印 111。 SymPy版本怎么样?我感到同情。Lambda() 应该具有递归功能,类似于过程编程的递归调用。有什么好办法吗?

  • 只是用一个实例调用(显然)进入了iloop。collatz()sympy.Symbol()
  • sympy.series.sequences.RecursiveSeq()仅执行具有恒定递减的向后引用。
辛皮 ·科拉茨

评论

0赞 smichr 1/22/2023
有人在这里提出了这个建议,我也在那里留下了评论,并建议一个具有象征意义的版本。
0赞 user1488065 1/22/2023
你能把生成器变成返回步数的实例吗?我没有做过这样的事情。sympy.Lambda
0赞 smichr 1/22/2023
目前还不清楚你给出的功能对你没有做什么。你想与众不同吗?
0赞 user1488065 1/22/2023
''' from sympy import * f = Function('f') x = var('x') y = x * f(x) z = y / f(x) print(z.subs({x: 1})) ''' 此代码未定义,但打印 .Collatz 可能需要很多时间来计算,所以当最终不需要它时,我想不计算它。所以我想把它变成一个sympy函数。f1

答:

0赞 smichr 1/22/2023 #1

让象征性的 collatz 结果。先进行替换,然后进行替换以替换任何非符号结果:f(x)

>>> f=Function('f')
>>> eq = f(x)
>>> eq.subs(x, 270)
f(270)
>>> _.replace(lambda x: x.func == f and x.args[0].is_Integer, lambda x: collatz(x.args[0]))
42

如果你不想这样做,想要自动计算,那么你将不得不编写一个从 Function 派生的 SymPy 类,该类有一个 eval 方法,用于检测输入何时是 Integer。您可以查看任何函数来了解它是如何实现的,例如,请参阅 的源代码。cos