- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试创建一个函数 prime-factors
来返回数字的质因数。为此,我创建了 is-prime
函数和 prime-factors-helper
来对素因子进行递归检查。
(defun is-prime (n &optional (d (- n 1)))
(if (/= n 1) (or (= d 1)
(and (/= (rem n d) 0)
(is-prime n (- d 1)))) ()))
(defun prime-factors-helper (x n)
(if (is-prime x) (list x)
(if (is-prime n)
(if (AND (= (mod x n) 0) (< n (/ x 2)))
(append (list n) (prime-factors-helper (/ x n) (+ 1 n)))
(prime-factors-helper x (+ 1 n)))
(prime-factors-helper x (+ 1 n)))))
(defun prime-factors (x)
(prime-factors-helper x 2))
prime-factors
的主要功能似乎适用于某些数字。然而,对于大数,它返回 "Stack overflow (deep)"
。
CL-USER 44 : 5 > (prime-factors 66)
(2 3 11)
CL-USER 49 : 5 > (prime-factors 512)
"Stack overflow (deep)"
你能告诉我为什么会返回这个错误吗?递归调用有问题吗?
[更新]
我重新定义了 is-prime
函数,但显然这不是问题所在。
(defun is-prime (x &optional (i 2))
(if (= x 1) nil
(if (or (= x 2) (= x 3)) t
(if (<= i (sqrt x))
(if (= (mod x i ) 0) nil
(is-prime x (+ i 1)))
t))))
(defun prime-factors-helper (x n)
(if (is-prime x)
(list x)
(if (is-prime n)
(if (AND (= (mod x n) 0) (<= n (/ x 2)))
(cons n (prime-factors-helper (/ x n) n))
(prime-factors-helper x (+ 1 n)))
(prime-factors-helper x (+ 1 n)))))
优化问题
我还有另一个优化问题。当我有一个大数字时,例如 123456789
,我收到此错误消息 Stack overflow (stack size 261120)
。我相信因为正确的答案是 (3 3 3607 3803)
,我的程序一旦用前两个元素 (3 3)
构造列表,它就会这样长期寻找下一个质因数。如何优化我的代码?
最佳答案
关于您的代码的一些一般性说明:
(defun is-prime (x &optional (i 2))
(if (= x 1) nil
(if (or (= x 2) (= x 3)) t
(if (<= i (sqrt x))
(if (= (mod x i ) 0) nil
(is-prime x (+ i 1)))
t))))
(defun prime-factors-helper (x n)
(if (is-prime x) (list x)
(if (is-prime n)
(if (and (= (mod x n) 0) (<= n (/ x 2)))
(append (list n) (prime-factors-helper (/ x n) (+ 1 n)))
(prime-factors-helper x (+ 1 n)))
(prime-factors-helper x (+ 1 n)))))
(defun prime-factors (x)
(prime-factors-helper x 2))
CL-USER 44 : 5 > (prime-factors 66)
(2 3 11)
您应该改进的几件事:缩进、代码格式、正确使用 REPL 和 Lisp 函数的选择:
代码缩进和格式化
让我们从缩进和格式开始。通常的缩进是:
(defun is-prime (x &optional (i 2))
(if (= x 1)
nil
(if (or (= x 2) (= x 3))
t
(if (<= i (sqrt x))
(if (= (mod x i ) 0)
nil
(is-prime x (+ i 1)))
t))))
(defun prime-factors-helper (x n)
(if (is-prime x)
(list x)
(if (is-prime n)
(if (and (= (mod x n) 0) (<= n (/ x 2)))
(append (list n) (prime-factors-helper (/ x n) (+ 1 n)))
(prime-factors-helper x (+ 1 n)))
(prime-factors-helper x (+ 1 n)))))
(defun prime-factors (x)
(prime-factors-helper x 2))
改进代码
现在我们可以重写前两个函数:
使用case
比较数字,然后您可以使用or
、and< 将
而 if
表达式重写为逻辑表达式 不是
。
(defun is-prime (x &optional (i 2))
(case x
(1 nil)
((2 3) t)
(t (or (not (<= i (sqrt x)))
(and (/= (mod x i) 0)
(is-prime x (+ i 1)))))))
接下来我们使用 cond
减少缩进级别。
(append (list foo) bar)
只是 (cons foo bar)
。
我们也可以去掉一个if
。
(defun prime-factors-helper (x n)
(cond ((is-prime x)
(list x))
((and (is-prime n)
(= (mod x n) 0)
(<= n (/ x 2)))
(cons n (prime-factors-helper (/ x n) (+ 1 n))))
(t (prime-factors-helper x (+ 1 n)))))
测试函数
现在我们需要测试一下:
(defun test (&optional (n 20))
(loop for i from 2 below n
for factors = (prime-factors i)
do (print (list i
(= (reduce #'* factors) i)
(cons '* factors)))))
有问题:解决!
如您所见,还有一个问题...当我们计算 8 的因数时,我不得不将代码从无限循环中打断。
CL-USER 51 > (test)
(2 T (* 2))
(3 T (* 3))
(4 T (* 2 2))
(5 T (* 5))
(6 T (* 2 3))
(7 T (* 7))
Break.
1 (continue) Return from break.
2 (abort) Return to top loop level 0.
但是那个很容易修复,留作练习。
REPL。
当你在 LispWorks 中有这样的提示时
CL-USER 44 : 5 >
这意味着您的休息深度为五(!)级。
输入 :top
命令进入顶级 repl 的时间:
CL-USER 44 : 5 > :top
CL-USER 45 >
关于lisp - Lisp 中的 "Stack overflow (deep)"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49348712/
你能告诉我,下面两种 scss 样式之间的区别吗?我对此没有清楚的认识。 :host { display: inline-block; /deep/ { span { co
/deep/和::ng-deep 这些在 DOM 模式下也被弃用了,我想知道将来是否会有/deep/和::ng-deep 的替代方案,或者我们应该开始使用其他方式? ::ng-deep .result
长期以来,我一直在寻找这个问题的明确答案。是否有可靠且推荐的替代策略来执行此操作?此问题的不正确答案包括: Just favor ::ng-deep for now 和 if component au
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 2 年前。 Improve this qu
我正在阅读 DQN 网络上的 deepmind 自然论文。 我几乎得到了关于它的一切,除了一个。我不知道为什么以前没有人问过这个问题,但无论如何对我来说似乎有点奇怪。 我的问题: DQN 的输入是一个
我在我的新 Jetpack Compose 应用程序中设置了一个底栏,其中包含 2 个目的地。我尝试遵循 Google 的示例。 例如它看起来像这样: @Composable fun MyBottom
所以,我读过 here在 Vue.js 中,您可以在选择器中使用 /deep/ 或 >>> 来创建适用于子组件内部元素的样式规则。但是,尝试在我的样式中使用它,无论是在 SCSS 中还是在普通的旧 C
我正在尝试实现DQN和DDQN(两者都有经验回复)来解决OpenAI AI-Gym Cartpole环境。这两种方法有时都能学习并解决这个问题,但并非总是如此。 我的网络只是一个前馈网络(我尝试过使用
scss中下面两个有什么区别,在片段中给出一些例子。 :host::ng-deep .content-body { ... } 和 .content-body :host::ng-deep { ...
在我们的元素中,我们使用了 Angular Material 进行开发。我们已经覆盖了 使用::ng-deep 的 Angular Material 样式自定义 CSS 属性。 在使用::ng-dee
我尝试熟悉 Q-learning 和深度神经网络,目前尝试实现 Playing Atari with Deep Reinforcement Learning . 为了测试我的实现并尝试使用它,我坚持尝
我开始在 Vue 3 中收到以下警告 ::v-deep用法。 ::v-deep usage as a combinator has been deprecated. Use ::v-deep() in
谁能给我解释一下 df2 = df1 df2 = df1.copy() df3 = df1.copy(deep=False) 我已经尝试了所有选项并执行了以下操作: df1 = pd.DataFram
我对 PyTorch 比较陌生,但我对 Keras 和 TensorFlow 有很好的经验。我关注了这个article在我自己的训练脚本中使用 DDP。然而,出于某种原因,我总是最终得到: proce
我正在尝试为 Conv2D 和 transposeconv2D 层编写 dropconnect 代码。按照 https://pytorchnlp.readthedocs.io/en/latest/_m
我正在做一个 mask 检测项目,我使用 ultralytics/yolov5 训练了我的模型。我将训练好的模型保存为一个 onnx 文件,你可以在这里找到模型文件 model.onnx .现在我希望
我正在研究一种强化算法,我对此很陌生,并试图掌握一些东西。 Player1Env 查看 7x6 Connect4 游戏网格。我按如下方式初始化类: def __init__(self): su
我有几个嵌入矩阵,假设 E1 矩阵用于 Glove,E2 用于 Word2vec。 我想构建一个简单的情感分类器,它采用该嵌入的可训练加权和。 例如,对于单词“dog”,我想在学习 x 和 y 时得到
我正在使用它处理深度学习和医学图像分类。我使用大脑 MRI 数据并将它们转换为 jpg。然后使用 VGG16 进行训练。当我检查损失、准确性、验证损失和验证准确性时,我看到了下图。 accuracy
我设计的网络包括转置卷积层。(pytorch 中的 ConvTranspose2d) 我想获得网络的感受野大小。 感受野的概念是否也适用于转置卷积层? 如果是,那我怎样才能得到它? 最佳答案 您可以使
我是一名优秀的程序员,十分优秀!