Scheme (方案)查找列表中两个单词之间的距离?
好的,我正试图写一个函数,用来计算列表中两个元素s和t之间的距离 例如,如果s=bob,t=pizza:Scheme (方案)查找列表中两个单词之间的距离?,scheme,Scheme,好的,我正试图写一个函数,用来计算列表中两个元素s和t之间的距离 例如,如果s=bob,t=pizza: (d 'bob 'pizza '(bob blah blah pizza)) 它将返回:3 这就是我目前所拥有的 (define dist (lambda (s t line) (cond [(equal? s (car line)) [(equal? t (car (cdr line))) 1]] [else (add1 (dist s t (
(d 'bob 'pizza '(bob blah blah pizza))
它将返回:3
这就是我目前所拥有的
(define dist
(lambda (s t line)
(cond
[(equal? s (car line))
[(equal? t (car (cdr line)))
1]]
[else (add1 (dist s t (cdr line)))])))
由于某种原因,它不起作用。帮忙
谢谢 当您在最后一步中使用(cdr行)时,您将丢弃bob,即使bob是第一个元素
你需要处理3到4个病例。
其中s和t与前两个元素匹配,你做得很好。
其中,s匹配,t不匹配。您需要在删除第2个元素的情况下,使用line向递归调用添加1。类似于(cons(汽车线路)(cdr(cdr线路)))。
如果s不匹配,您需要移除线路上的车辆并重试。
除非您确定s和t都会发生,并且为了避免出现行外情况,您需要一个终止条件。问题中建议的代码不起作用,它只是检查列表中的两个元素是否连续。让我们尝试一种完全不同的方法-将问题分成更小的子问题,首先定义一个过程,返回列表中元素的索引,从零开始计算索引:
(define (index-of elt lst)
<???>) ; ToDo
例如:
(dist 'bob 'pizza '(bob blah blah pizza))
=> 3
对于额外的信用,考虑列表中不存在一个或两个元素的情况(因此<代码> <代码>索引应该返回一个值,该值表示,例如,“代码> < f >代码>”,或者当“代码> S/<代码>在列表中<代码> t>代码>之后出现。
< p>这是一个每次迭代列表中寻找“s”和“t”的解决方案。当两者都被看到时,返回结果;否则,请继续查看:(define (dist s t line)
(let looking ((l line) (n 0) (i #f))
(and (not (null? l))
(let ((item (car l)))
(if (or (equal? item s)
(equal? item t))
(if (not i)
(looking (cdr l) (+ n 1) n) ; found first, continue
(- n i)) ; found second, done
(looking (cdr l) (+ n 1) i)))))); continue looking
我的方案有点过时了,但是那些
[
和]
看起来不合适。由于(我认为)您只有两个子句,if不是更简单吗?@crashmstr允许使用[]
代替()
,这有助于澄清。例如,用于区分cond
的子句。将其分隔会使其更容易。我想我现在明白了
(define (dist s t line)
(let looking ((l line) (n 0) (i #f))
(and (not (null? l))
(let ((item (car l)))
(if (or (equal? item s)
(equal? item t))
(if (not i)
(looking (cdr l) (+ n 1) n) ; found first, continue
(- n i)) ; found second, done
(looking (cdr l) (+ n 1) i)))))); continue looking