gpt4 book ai didi

Lisp 变量不递增?

转载 作者:太空宇宙 更新时间:2023-11-03 18:47:32 26 4
gpt4 key购买 nike

如果此问题已在其他地方得到解答,我深表歉意,但我似乎找不到对我遇到的问题的详细解释。这也是我关于 SO 的第一篇文章...

基本上这是一项家庭作业,但是,我并不是在寻找解决方案,因为我已经在 SO 上看到了一个可行的解决方案。坦率地说,我想实现我自己的解决方案,这样我就可以学习,因为我对让我的头脑围绕 lisp/scheme 非常感兴趣。这个想法是计算列表中有多少个 0 或任何元素/原子,然后显示/返回。

我确信通过查看代码可以很容易地看出我的逻辑在做什么。我遇到的问题是每次递归时都会增加 totalZeros 变量。 (+ 5 myNum) 肯定会将 5 添加到 myNum 中。因此,为什么 (+ 1 totalZeros) 似乎不起作用?当我单步执行调试器时,我可以看到 totalZeros 变量永远不会改变。它始终为零...

(define (countZeros aList)
(define totalZeros 0)

(define (iterator aList)
(let ((listSize (length aList)))
(if (> listSize 0)
(let ((tempVar (car aList)))
(when (eq? tempVar 0)
(+ 1 totalZeros))
(iterator (cdr aList)))
0)))

(let ((listSize (length aList)))
(when (> listSize 0)
(iterator aList))
(display totalZeros)))

最佳答案

问题是这个表达式:

(+ 1 totalZeros)

totalZeros 的值加一,但随后对结果不做任何处理,因此它丢失了。你熟悉其他编程语言吗?上面的内容与使用类似 C 的语言执行此操作相同:

totalZeros + 1;

显然,如果您不将加法的结果存储在某处,该值将被丢弃。回到你的代码,如果你打算将加法存储在同一个变量中(就像 totalZeros++; 表达式就可以),这是在 Scheme 中的写法:

(set! totalZeros (+ 1 totalZeros))

事实上,通过使用上面的行,您的代码就可以工作了。虽然可以用这样的过程风格编写正确的程序——定义一个局部变量并随时改变它的值,但不推荐这样做。这对于类 C 语言是正确的,但这不是您在 Scheme 中考虑解决方案的方式,通常您会将修改后的值作为参数传递给函数调用;这是一个等效的、更惯用的解决方案:

(define (countZeros aList)
(define (iterator aList totalZeros)
(cond ((null? aList)
totalZeros)
((zero? (car aList))
(iterator (cdr aList) (add1 totalZeros)))
(else
(iterator (cdr aList) totalZeros))))
(iterator aList 0))

(display (countZeros '(1 2 0 3 0 4 5 0 6 0 7 0 0)))
=> 6

注意 null? 如何用于确定列表是否为空(而不是使用 length),并查看过程 zero?add1 被使用。请注意 totalZeros 计数器如何作为参数传递,如何在调用迭代器时将其初始化为 0,以及如何在递归结束时返回它,当列表为空时。还要注意 cond 在有多个条件需要考虑时是如何有用的,以及函数应该返回一个值的事实,仅使用 display 打印该值之后 它被称为。

以上将解决问题,但它没有利用可用的程序。事实上,解决问题的首选方法是重用现有功能。在 Racket 中,您可以简单地调用 count 过程,告诉它计算列表中找到的所有零:

(define (countZeros aList)
(count zero? aList))

(display (countZeros '(1 2 0 3 0 4 5 0 6 0 7 0 0)))
=> 6

关于Lisp 变量不递增?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19476293/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com