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这是正确的