Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme (方案)查找列表中两个单词之间的距离?_Scheme - Fatal编程技术网

Scheme (方案)查找列表中两个单词之间的距离?

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 (

好的,我正试图写一个函数,用来计算列表中两个元素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 (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