我是Scheme(通过Racket)和(在较小程度上)函数式编程的新手,并且可以通过变量和递归使用一些关于积累的优缺点的建议.出于本示例的目的,我正在尝试计算移动平均线.因此,对于列表'(1 2 3 4 5)
,3期移动平均线将是'(1 2 2 3 4)
.我们的想法是,期间之前的任何数字都不是计算的一部分,一旦我们达到集合中的期间长度,我们就会根据所选择的期间开始对列表的子集进行平均.
所以,我的第一次尝试看起来像这样:
(define (avg lst)
(cond
[(null? lst) '()]
[(/ (apply + lst) (length lst))]))
(define (make-averager period)
(let ([prev '()])
(lambda (i)
(set! prev (cons i prev))
(cond
[(< (length prev) period) i]
[else (avg (take prev period))]))))
(map (make-averager 3) '(1 2 3 4 5))
> '(1 2 2 3 4)
Run Code Online (Sandbox Code Playgroud)
这有效.我喜欢使用地图.它看起来很容易构建并且可以重构.我可以在将来看到堂兄弟像:
(map (make-bollinger 5) '(1 2 3 4 5))
(map (make-std-deviation 2) '(1 2 3 …
Run Code Online (Sandbox Code Playgroud) 我正在我的人工智能实验室学习Prolog,从源头学习Prolog Now!.
在第5章中,我们来了解累加器.作为示例,给出了这两个代码片段. 查找列表的长度
没有累加器:
len([],0).
len([_|T],N) :- len(T,X), N is X+1.
Run Code Online (Sandbox Code Playgroud)
与累加器:
accLen([_|T],A,L) :- Anew is A+1, accLen(T,Anew,L).
accLen([],A,A).
Run Code Online (Sandbox Code Playgroud)
我无法理解,这两个片段在概念上有何不同?累加器到底有什么不同?有什么好处?
蓄能器听起来像中间变量.(如果我错了,请纠正我.)到目前为止,我已经在我的程序中使用过它们,所以它真的是一个很大的概念吗?
我有一个我用多行创建的.txt文件.
当我使用计数累加器运行for循环时,它会跳过行.
它跳过顶线,从第二个开始,打印第四个,第六个等...
我错过了什么?
** for your reading pleasure**
def main():
# Open file line_numbers.txt
data_file = open('line_numbers.txt', 'r')
# initialize accumulatior
count = 1
# Read all lines in data_file
for line in data_file:
# Get the data from the file
line = data_file.readline()
# Display data retrieved
print(count, ": ", line)
# add to count sequence
count += 1
Run Code Online (Sandbox Code Playgroud) 如果问题很愚蠢的话,我对Haskell完全不熟悉.
我想要做的递归是建立一个列表,而在同一时间建立的累计值基础上的递归调用.这是我正在为Coursera课程做的一个问题,所以我不会发布确切的问题,但类似的东西.
例如说我想采取INTS的列表和双每一个(忽略,我可以只使用例子的目的map
),但我也想计数数"5"有多少次出现在列表中.
所以要加倍我可以做到这一点:
foo [] = []
foo (x:xs) = x * 2 : foo xs
Run Code Online (Sandbox Code Playgroud)
到目前为止这么容易.但是我怎样才能保持五倍的计数x
呢?我得到的最好的解决方案是使用这样的显式累加器,我不喜欢它,因为它反转列表,所以你需要在结束时反向:
foo total acc [] = (total, reverse acc)
foo total acc (x:xs) = foo (if x == 5 then total + 1 else total) (x*2 : acc) xs
Run Code Online (Sandbox Code Playgroud)
但我觉得这应该能够被State
monad 处理得更好,我之前没有用过,但是当我尝试构建一个适合我看到的模式的函数时,我会因为递归调用而陷入困境foo
.有没有更好的方法来做到这一点?
编辑:我需要这个工作很长的列表,所以任何递归调用也需要尾递归.(由于Haskell的'tail recursion modulo cons',我在这里的例子设法是尾递归的).
我有像这样的Scala代码
var i = 1
for(e <- array) {
acc += e * i
i += 1
}
Run Code Online (Sandbox Code Playgroud)
我需要将数组中的第一个元素乘以1,将下一个元素乘以2,将下一个元素乘以3,然后将它们全部添加到累加器中.我觉得在Scala中有更好的方法,甚至可以折叠?
我看到代码如下:
mov ax, cs
mov ds, ax
mov es, ax
Run Code Online (Sandbox Code Playgroud)
为什么我不能将其压缩为:
mov ds, cs
mov es, cs
Run Code Online (Sandbox Code Playgroud)
自使用累加器寄存器以来,第一种方式更快吗?但这似乎并不直观,因为cs和ds是段寄存器.还是有一些我不知道的限制?
顺便说一句,我正在使用nasm.
我不确定有什么不同,但问题就在这里.
编写一个赋值语句, 将名为numStudents的计数器变量更新为1.它是否为:
numStudents = numStudents + 1
?我的另一个问题是
编写赋值语句,使用sales变量中的值更新名为total的累加器变量. 会不会像:
总计=总计+销售额
?
我正在尝试将列表中的一堆元素组合在一起以创建最终对象,其方式类似于创建对象的总和.我正在尝试使用一个简单的变体来reduce
考虑一个对的列表而不是一个平面列表来执行此操作.我想做一些事情:
nums = [1, 2, 3]
reduce(lambda x, y: x + y, nums)
Run Code Online (Sandbox Code Playgroud)
除了我想在数字列表中的每个元素的特定总和中添加附加信息nums
.例如,对于列表中的每对(a,b),将总和运行为(a + b):
nums = [(1, 0), (2, 5), (3, 10)]
reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums)
Run Code Online (Sandbox Code Playgroud)
这不起作用:
>>> reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
TypeError: 'int' object is unsubscriptable
Run Code Online (Sandbox Code Playgroud)
为什么不起作用?我知道我可以编码nums
为一个平面列表 - 这不是重点 - 我只是希望能够创建一个reduce操作,可以遍历一对对,或同时在两个相同长度的列表上迭代,并从两个池中汇集信息名单.谢谢.
假设我有三个数组,描述了一些名称,阅读的书籍数量以及这些人[名字]中有多棒:
let names = ["Mary", "Joe", "Kenan"];
let numberOfBooks = [2, 1, 4];
let awesomenessLevel = ["pretty cool", "meh", "super-reader"];
Run Code Online (Sandbox Code Playgroud)
我正在尝试.reduce()
将它们组合在一起以创建一个包含每个数组中相关索引的对象数组,但我失败了:
let people = [
{
name: "Mary",
noOfBooks: 2,
awesomeness: "pretty cool"
},
{
name: "Joe",
noOfBooks: 1,
awesomeness: "meh"
},
{
name: "Kenan",
noOfBooks: 4,
awesomeness: "super-reader"
}
]
Run Code Online (Sandbox Code Playgroud)
我也减少了它:
let arrFinal = [];
names.reduce(function(all, item, index) {
arrFinal.push({
name: item,
noOfBooks: numberOfBooks[index],
awesomeness: awesomenessLevel[index]
})
}, []);
Run Code Online (Sandbox Code Playgroud) 如果您正在编写程序集,那么将值分配给哪个寄存器重要吗?假设您将累积/中间值存储在 %ebx 而不是 %eax 中,后者传统上用于此目的。这是不好的做法吗?会影响性能吗?
换句话说,您是否可以将它们等同于存储空间,还是应该坚持将它们用于特定目的?