Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.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
Javascript 如何在没有变异的情况下实现该算法_Javascript_Algorithm - Fatal编程技术网

Javascript 如何在没有变异的情况下实现该算法

Javascript 如何在没有变异的情况下实现该算法,javascript,algorithm,Javascript,Algorithm,我试图用函数语言实现以下算法,使用不变性、高阶函数和/或递归(无循环或变异) 该算法迭代一个列表,对于每对相邻元素,如果左侧大于右侧,则交换它们 但是,如果两个相邻元素之间的差值小于某个数字(例如10),则应使用这些参数调用函数(notify) 关于如何重写它有什么建议吗 for (i = 1, i < queue.legth, i++) { left = queue[i-1] right = queue[i] if (abs(left - right) < 10) {

我试图用函数语言实现以下算法,使用不变性、高阶函数和/或递归(无循环或变异)

该算法迭代一个列表,对于每对相邻元素,如果左侧大于右侧,则交换它们

但是,如果两个相邻元素之间的差值小于某个数字(例如
10
),则应使用这些参数调用函数(
notify

关于如何重写它有什么建议吗

for (i = 1, i < queue.legth, i++) {
  left = queue[i-1]
  right = queue[i]

  if (abs(left - right) < 10) {
    notify(left, right)
  } else if (left > right) {
    queue[i-1] = right
    queue[i] = left
  }
}
for(i=1,i右){
队列[i-1]=右
队列[i]=左侧
}
}
更新


是的,应该返回一个新的列表,而不是对列表进行适当的修改

JavaScript是一种可怕的语言。但这里有一个想法

首先实现链表。您的API可以包括以下命令:

var empty_list = create_empty_list()
var larger_list = list.prepend(thing)
var is_empty = list.is_empty()
var first_element = list.head()
var tail = list.tail()
var reversed_list = list.reversed()
在内部,链表只是一个有头部的对象,另一个对象指向尾部。因此,在列表前加前缀只意味着创建一个新节点,新节点的值指向旧节点。(不是变异!)所以你有访问器。然后,
reversed
是一个简单的递归函数。(您需要一个助手函数
list.\u reversed(tail)
然后
list.reversed()
就是
list.\u reversed(create\u empty\u list())
。助手函数为空列表返回
tail
,否则返回
this.tail.\u reversed(tail.prepend(this.head))


使用链表,您可以遍历队列,构建重新排列的列表并在需要的位置调用
notify
。当您完成了对队列的迭代后,就会得到一个完全向后的链表。然而,然后你调用
reversed
,以获得正确的队列顺序。

你说的“没有变异”是什么意思?
forEach
,或
reduce
是否算作变异?”(没有循环或变异)“递归存在吗?数组中“交换”的概念本身就意味着变异。我认为您需要一个函数,该函数在匹配时返回一个新数组,其中包含交换的元素scenario@Sergio这是正确的