- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚开始学习 Racket,所以我仍在努力弄清楚这门语言的复杂性。我正在尝试在列表中实现我自己的搜索功能。如果函数找到它,则返回索引,否则返回 -1。
(define (find-index list item)
(if (equal? (length list) 1)
(if (equal? (first list) item) 0 1)
(if (equal? (first list) item)
0
(+ 1 (my-search (rest list) item)))))
所以 find-index 函数是一个递归函数,它遍历列表以寻找与“item”等价的项目。我这样写,如果列表中有 4 个元素,该函数可以返回 0-4 之间的任何数字。
(define (my-search list item)
(define length (my-length list))
(define index (find-index list item))
(if (= index length) -1 index))
我的想法是,如果 find-index 函数返回一个等于列表长度的数字,则意味着函数没有找到该项目,因此 my-search 函数应该返回 -1。
但是,当我输入
(my-search (list "apple" "barbecue" "child" "demon" "enter") "fire")
我得到的结果是 3,而不是 -1。如果我在 if 语句之前打印索引,则索引为 3 而不是 5。如果
(if (= index length) -1 index))
不是我的搜索功能的一部分,那么一切都很好。
我认为发生的事情是索引是函数本身的 id,而不是函数的结果。但是,我不明白为什么这会影响我的搜索的返回结果。有人愿意阐明这个问题吗?
此外,欢迎任何风格评论。我想知道我是否没有遵守约定。
最佳答案
奇怪的行为是由于 find-index
调用 my-search
而调用 find-index
(相互的递归!)。在某些时候,额外的 if
会导致递归过早结束。解决方案:在 find-index
过程中将对 my-search
的调用替换为 find-index
。
既然已经解决了,我们可以编写一个过程来查找列表中元素的索引或发出未找到该元素的信号,如下所示:
(define (find-index lst item)
(cond ((empty? lst) #f)
((equal? (first lst) item) 0)
(else
(let ((result (find-index (rest lst) item)))
(if result (add1 result) #f)))))
让我们看看以上内容如何改进您的程序:
cond
list
作为参数名,它与同名的内置过程冲突length
为局部定义length
来检查我们是否超出列表不是一个好主意,构建良好的递归将解决这个问题,而不必重新遍历列表#f
来表示搜索过程没有找到它要查找的内容let
来声明局部变量,在这种情况下它是有意义的,以避免调用递归两次(add1 x)
,它比(+ 1 x)
更加地道但是等等,我们可以做得更好!可以用尾递归 风格重写上述解决方案;通过确保递归调用是我们做的最后一件事,我们的过程将使用常量空间,并且它将与传统编程语言中的循环一样高效。诀窍是传递一个带有要返回值的额外参数(在本例中为索引)。为简洁起见,我将使用命名的 let
:
(define (find-index lst item)
(let loop ((lst lst) (idx 0))
(cond ((empty? lst) #f)
((equal? (first lst) item) idx)
(else (loop (rest lst) (add1 idx))))))
您可以验证这两个过程是否如宣传的那样工作:
(find-index (list "apple" "barbecue" "child" "demon" "enter") "fire")
=> #f
(find-index (list "apple" "barbecue" "child" "demon" "enter") "child")
=> 2
关于if-statement - 新 Racket : why is the if statement affecting the return?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39339604/
我一直在寻找一种在 EF Core 中编写“通用”更新方法的解决方案,该方法更新实体的所有已更改属性,包括相关集合。这样做的原因是我将实体名称的翻译存储在不同的表中。我找到了 this解决方案一开始似
我将 Identity Core 1.0 与 ASP.NET MVC Core 1.0 和 Entity Framework Core 1.0 结合使用来创建一个简单的用户注册系统 this arti
我必须创建一个悬停效果,其中当一个选项卡悬停时,该选项卡的整个背景应该是白色的。但正如下面 SS 中所见, , 悬停效果仅应用于文本部分。 我还附上了 Chrome Web 开发人员的 CSS。 生成
我正在研究一个 Prolog 问题,包括计算列表元素的数量: count([], 0). count([H|T], N) :- count(T, X), N is X+1, N
在下面的代码中,在 #content 规则中,overflow:hidden 做了一些魔术来自动调整 div 的 width。我尝试在 #content 中手动将宽度设置为某个值,例如 10000px
所以我有一些 CSS 生成这个。 HTML代码如下。 Home A
我喜欢使用 Visual Studio 中的“在 Microsoft Exel 中打开查询”按钮在 Excel 中管理父子 TFS 链接。我可以在 Excel 中创建两个工作项之间的父子关系,方法是剪
我目前正在尝试提高构建机器的性能。标准构建在每次提交 (svn) 后排队,大约需要 40 分钟。如果提交时已经有一个排队的构建,我们不会添加另一个。所以每个构建都有 1+ 次提交的更改。由于提交可能没
在列出的 php 文档中 here有迹象表明该函数使用读取、错误和写入数组值作为引用,但我无法在任何地方找到这些值中实际发生的变化。 我写了一个我现在使用的简单“服务器”,我注意到当提到的函数无法看到
嗨,我正在尝试定位第一个 .current-cat-parent 下的元素,但我的 jquery 代码正在影响所有 这下面的元素。我怎样才能只定位第一个立即元素?谢谢! $(".current-ca
我有一张表,我在 data_id 上有自动编号/序列 tabledata --------- data_id [PK] data_code [Unique] data_desc 示例代码: ins
我已经创建了 JFormattedTextField 的自定义组件 (NumberFormattedTextField)。这是我使用的格式化程序: public static Internat
据我了解,Apple 应用程序更新将安装一个新的独立应用程序,而不是对现有应用程序应用补丁。 有谁知道这个过程的更多细节吗?这适用于用户的所有目录吗?任何文件夹(如私有(private)文档)都不会受
我有一个允许我定义 alpha 背景的 sass mixin @mixin background-rgba($r,$g,$b,$a) { $color: ie_hex($r,$g,$b,$a)
我正在网络抓取如下表中的文本数据,我想获得结果: Lorem ipsum dolor sit amet consectetur adipiscing elit, sed do eiusmod temp
我正在学习事件委托(delegate),但遇到了问题。 一开始我做初稿的时候,如果点击只会删除文字,不会删除按钮,所以我修改了它。后来,当点击容器div时,它删除了整个内容,所以我再次更改它。 现在它
这个问题在这里已经有了答案: Why is this inline-block element pushed downward? (8 个答案) Align inline-block DIVs t
父元素没有溢出属性。父元素具有设置的高度。无论我尝试什么,导航栏都不会粘住。它也不适用于 JavaScript。我肯定错过了什么。下面是代码。有人请告诉我我做错了什么: /* Body */ body
问题 我的页脚中有四列,每列宽度为 25%。 对于平板电脑,宽度变为 50% - 每行两个。 但是,我无法对齐前两列和后两列。 这是一张显示它们当前外观的图片: 我试图让它们看起来像: |------
我正在尝试为网站构建菜单,我使用了以下代码: nav#menu:hover li{ background-color: #606060; } 但是,当我将鼠标悬停在网站上的列表项上时,代码会更
我是一名优秀的程序员,十分优秀!