提问人:user1488065 提问时间:1/22/2023 更新时间:1/22/2023 访问量:44
我怎样才能写出 SymPy 的 Collatz 猜想?
How can I write Collatz conjecture by SymPy?
问:
我打算编写一个 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
#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
评论
sympy.Lambda
f
1