Scheme中的Knuth-Morris-Pratt算法

问题描述

当使用knuth-Morris-Pratt算法时,这是在Scheme中计算故障函数(必须返回几步)的代码

k > 0

但我不理解{"request":"pois","geometry":{"geojson":{"type":"Point","coordinates":[125.6,10.1]},"buffer":200}} 时的内容。有人可以解释一下吗?

解决方法

我看到您对named let的语法感到困惑。这个post很好地解释了它的工作原理,但是也许使用更熟悉的语法的示例可以使事情更清楚。以Python中的这段代码为例,它将1到10之间的所有整数相加:

sum = 0
n = 1
while n <= 10:
  sum += n
  n += 1

print(sum)
=> 55

现在让我们尝试以递归的方式编写它,我将调用函数loop。这是完全等效的:

def loop(n,sum):
    if n > 10:
        return sum
    else:
        return loop(n + 1,n + sum)

loop(1,0)
=> 55

在上面的示例中,loop函数实现了迭代,参数n用于跟踪当前位置,参数sum累积答案。现在,让我们编写完全相同的代码,但是在Scheme中:

(let loop ((n 1) (sum 0))
  (cond ((> n 10) sum)
        (else (loop (+ n 1) (+ n sum)))))
=> 55

现在,我们定义了一个名为loop的本地过程,然后使用其参数1和{{1}的初始值0n自动调用}。当达到递归的基本情况时,我们返回sum,否则我们将继续调用此过程,并传递参数的更新值。它与Python代码完全相同!不要对语法感到困惑。

在您的算法中,sumi-p是迭代变量,分别被初始化为k2。根据条件为真,当我们再次使用0loop的更新值调用i-p时,迭代会继续进行,或者在达到k的情况下,迭代会结束至此,循环退出,计算出的值位于变量(>= i-p n-p)中。该过程以返回一个称为“故障功能”的新功能结束。