- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如果此问题已在其他地方得到解答,我深表歉意,但我似乎找不到对我遇到的问题的详细解释。这也是我关于 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/
我正在实现一个算法,当用户输入字符串时,字符串中的每个字符(如果是字母表)都应该增加给定的值(这里是旋转器)。我正在玩这个代码 2 小时,但无法弄清楚为什么当我按值旋转器递增时,它会按 rotator
我有 1.0.5。我怎样才能增加到 1.0.6? 试过了,但是不行。 echo 1.0.5 0.0.1 | awk '{sum=$1+$2; printf"%0.2f\n", sum }' 最佳答案
这个问题在这里已经有了答案: Behaviour of increment and decrement operators in Python (11 个回答) Why are there no ++
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
我正在尝试温习我的 C,我有以下代码,当我使用 i 偏移量但不使用 Hold++ 时,它可以工作,我不明白为什么我认为他们做了同样的事情?这是我无法开始工作的版本: char* reversestri
我需要增加/减少 PostgreSQL 数据库中的计时。 下面是包含列类型为"timestamp without time zone" 的表的输出 如果时间超过 24 小时,我也需要更改日期。请协助
我有一个名为 temp_rfm 的表,其中 col1 实际上是客户 ID(我有一个非法的联盟混合问题)和 calc_date 是增加月份的开始。 SELECT * FROM temp_rfm ; co
我目前正在处理我的应用程序的首选项,我必须设置一个角度。默认值约为 30°,用户应该能够调整此角度以使其最适合。 我不只是制作一个普通的 EditTextPreference,而是希望它可以像在其他应
这个问题已经有答案了: Increment a number by prefix and postfix operator (1 个回答) 已关闭去年。 我正在努力理解 Javascript 增量运算
我使用下面的 javascript 递归地重新加载一个目标 DIV,其 id="outPut",将参数传递给 getData.php 时执行数据查询的结果>。问题是 fadeTo 会淡化每次迭代调用返
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Jquery Draggable + Bring to Front 我有一个网站,用户可以在其中打开多个聊天
我必须定义一个函数,其中: Starting with a positive integer original, keep multiplying original by n and calculat
我正在我的应用程序中记录一些统计数据。其中一项统计数据是 BigDataStructure 的大小。我有两个选择: 创建一个计数器并递增/每次递减计数器有一个添加/删除大数据结构。 每次添加/删除从
在下面的 Java 示例程序中,我得到了无限循环,我不明白为什么: public class Time { public static int next(int v) { re
我从 C#/WPF 添加了一个意外的行为 private void ButtonUp_Click(object sender, RoutedEventArgs e) {
我想在 Python 2.7 中增加用户提供的字符串的最后一位数字。 我可以这样替换第一个数字: def increment_hostname(name): try: numb
我正在用蛮力搜索具有某些属性的 float (sin(a)^2+cos(a)^2-1 的小舍入误差)。因此,我想通过递增尾数来遍历给定 float 的邻域。 在 C 中是否有一种简单的方法可以做到这一
C 标准将 _Bool 定义为包含 0 或 1 的无符号类型。如果 _Bool 类型的值 1 递增,据我所知,有两个选项: 该值在 1 到 0 之间环绕 该值增加到 2,它是非零值,因此在转换回 _B
我有一个 INI 文件,其中存储了一些用于设置的整数。部分名称存储如下: [ColorScheme_2] name=Dark Purple Gradient BackgroundColor=224 B
我的应用程序中有这个方法: - (void)initializeTimer{ self.myTimer = [NSTimer scheduledTimerWithTimeInterval:th
我是一名优秀的程序员,十分优秀!