问题标签 [collatz]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 根据达到 1 所需的 Collatz 猜想的循环次数来查找数字
基本上,我想编写一个算法来找出哪个数字需要 500 次迭代才能达到 1。我尝试了一些变体,但无法做到正确。
到目前为止,这是我的代码:
编辑:代码的更新版本
java - 如何避免在 collatz 的 stackoverflow 获得高值?
我正在研究一个欧拉问题,你必须得到最长的 collatz 链。问题是,你必须从 1 到 1 000 000 的序列中找到它。我的代码在 100 000 之前工作得很好,然后它会抛出StackOverFlowError
. 我可以避免它,还是我的代码是废话?
python - 使用嵌套 while 循环的冰雹序列
我正在编写一个程序,允许用户输入一个数字范围,然后程序将对该范围内的每个数字执行一个冰雹序列,然后打印具有最大循环长度的数字。我不明白为什么我的代码不起作用。我们需要使用while循环
lisp - 为什么这会炸毁 Lispworks 中的堆?
我正在尝试解决Project Euler 中的问题 14(找到 1 到 1000000 之间最长的 Collatz 序列)。
我的代码由一个递归的记忆函数组成,用于计算 Collatz 序列的长度,然后是一个循环来找到最大值。请看下面的代码:
这在 Clozure 中运行良好,但在 Lispworks 中导致了堆溢出。由于它不优雅地退出,我无法找出发生了什么。实际上,我不明白为什么这会消耗这么多堆空间——最大的递归序列是 300 次左右的调用。我是否错过了代码中的一些低效率?
任何输入表示赞赏。对代码的进一步评论也受到赞赏。
PS:我使用的是 Lispworks 个人版,它对堆大小施加了限制。
更新 我确实尝试按照 Rainer Joswig 的建议进行编译,但没有帮助。
关于 coredump 和 sds 的评论,or
确实比if
这种情况下要好,但我不能用哈希表代替向量,因为 collatz 序列大约有 50% 的时间上升。运行代码后,哈希表有大约 250 万个条目。
最后,奇怪的是,我在测试一个较长的循环(一百万次迭代)的语法时设法重现了这个错误,该循环只是处理一些变量并且根本没有收集任何东西。不幸的是,我丢失了代码——LispWorks 只是失败了,唉。我最好的猜测是 LispWorks 的内脏中存在一些泄漏或其他内存管理故障。
java - 在java中解决3n+1
我正在尝试解决 java 中的 3n+1 问题。UVA 显示我的代码的运行时错误。我第一次尝试解决问题,但我无法找出问题所在。我用网站上给出的输入对其进行了测试,它可以工作。它被拒绝是因为我的代码运行缓慢吗?如果是这样,如何优化?
PFB 我的代码
prolog - Prolog 中的 Collatz 谓词
我坚持做一些 Prolog 练习。我要编写一个谓词 collatz2(X,N),假设我们知道 X 是什么,它返回 N,它是 1 的结果的索引(从 1 开始)。'collatz2' 是 Collatz 函数。所以假设我会写collatz2(5,N)
,它应该返回N=6
,因为collatz1(N)
(检查下面对这个谓词的解释)导致:
我写了一个谓词给出连续的数字:
但是,我无法弄清楚第二个谓词。它应该很简单,因为这只是我使用 Prolog 的开始。有人可以帮忙吗?
编辑:
它不是重复的。我还不知道列表,我需要使用我已经知道的(这只是真实的基础)。这是我到目前为止所拥有的:
但我需要以某种方式停止循环:) 谢谢:)
python - 使用 python 打印正整数 n 的 collatz 序列,每行一个值在 1 处停止
我弄完了:
调用此函数的正确输出,当 n = 10 时:
但唯一打印的数字是 n 本身。
java - 记忆效率问题(Collatz Hailstone 序列)
在过去的几天里,我对研究给定数字的冰雹序列的长度(科拉茨猜想)特别感兴趣(更多的是从算法而不是数学角度)。实现递归算法可能是计算长度的最简单方法,但在我看来,这似乎是对计算时间的不必要浪费。许多序列重叠;以 3 的冰雹序列为例:
3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1
长度为 7;更具体地说,需要 7 次操作才能达到 1。如果我们再采用 6 次:
6 -> 3 -> ...
我们立即注意到我们已经计算过了,所以我们只需添加 3 的序列长度,而不是再次遍历所有这些数字,从而大大减少了计算每个数字的序列长度所需的操作数。
我尝试使用 HashMap 在 Java 中实现这一点(考虑到 O(1) 概率获取/放置复杂性,这似乎是合适的):
本质上要做seqLen
的是从给定的数字开始,并通过该数字的 Hailstone 序列,直到遇到已经在 中的数字cache
,在这种情况下,它将添加到 的当前值count
,然后记录该值和关联的序列HashMap 中的长度为一(key,val)
对。
我还有以下相当标准的递归算法进行比较:
无论如何,日志记录算法应该比简单的递归方法运行得快很多。但是在大多数情况下,它根本不会运行得那么快,而且对于更大的输入,它实际上运行得更慢。运行以下代码会产生随n
更改大小而有很大差异的时间:
n = 1,000
: 两种算法~2msn = 100,000
:~65ms 用于迭代记录,~75ms 用于递归非记录n = 1,000,000
: ~500ms 和 ~900msn = 10,000,000
: ~14,000ms 和 ~10,000ms
在较高的值下,我会出现内存错误,所以我无法检查模式是否继续。
所以我的问题是:为什么对于较大的 n 值,日志记录算法突然开始比天真的递归算法花费更长的时间?
编辑:
完全废弃 HashMaps 并选择一个简单的数组结构(以及删除检查值是否在数组中的部分开销)会产生所需的效率:
迭代整个缓存大小(8000 万)现在只需 3 秒,而使用递归算法则需要 93 秒。HashMap 算法会引发内存错误,因此甚至无法进行比较,但考虑到它在较低值下的行为,我觉得它不能很好地比较。
javascript - 将数字推入一个数组,然后将该数组推入另一个数组 - JavaScript
我正在创建一个程序,它将两个变量作为用户提示。第一个是起始数字,下一个是确定范围的数字。然后,该程序使用 collatz 函数吐出输入的原始数字达到零需要多少步,然后将此信息显示到屏幕上。然后它应该将起始编号增加 1 并重复该过程,直到起始编号达到第二个输入的数字
目前我只为一个号码工作,这是原始的起始号码。我不确定如何编写 collatz 函数以遍历起始编号(第一个输入)和范围编号(第二个输入)之间的所有数字我的猜测是我需要某种 for 循环并推送一个值数组(数字达到 0 所需的步骤)作为另一个数组中的自己的数组(其中包含程序运行的所有数字的所有步骤)
如果有人可以提供帮助,我将不胜感激,谢谢
list - 蟒蛇 2.7。迭代列表不起作用
刚从 Python 开始并做了一些挑战,这个是关于 Collatz 数字的。但是,我一开始就被困住了,我传递给该collatz
方法的范围没有在给定范围内迭代。
我在这里想念什么?