2

如何制作其他列表的累积总和列表?

我是这样尝试的:

;;all temperatrue-values around the turtle saved in list 
set temperature_values (list [(output-heat + 1)^ Freedom] of neighbors) 


;;build cumulative value of temperatures and put each value in list 
let tempsum 0 
set tempsum_list [] 
foreach temperature_values 
[set tempsum (tempsum + ? ) 
set tempsum_list fput tempsum tempsum_list 

] 

但它不起作用。谁能解决这个问题?它说“+ 排除了输入但得到了一个列表”。

4

4 回答 4

3

您的累积总和代码有效(除了我认为您需要lput而不是fput. 您可以通过以下方式看到它:

to test
  let ll [1 2 3 4] 
  let tempsum 0 
  let tempsum_list [] 
  foreach ll 
  [ set tempsum (tempsum + ? ) 
    set tempsum_list lput tempsum tempsum_list 
  ]
  print tempsum_list
end

错误是否突出显示了该行set temperature_values (list [(output-heat + 1)^ Freedom] of neighbors)?尝试在 ) 和 ^ 之间加一个空格。NetLogo 对数学运算符周围的空间很挑剔。

于 2015-11-06T20:26:24.663 回答
1

正如 Jen 建议的那样,您可以使用foreach. 另一个不错的方法是减少:

to-report partial-sums [#lst]
  set #lst (fput [0] #lst)  ;;prepare for reduce
  report butfirst reduce [lput (?2 + last ?1) ?1] #lst
end
于 2015-11-07T01:12:41.937 回答
1

类似于 Alan 的解决方案(只是最新版本的 NetLogo 的更新,将 ? 替换为 -> 用于匿名过程。)

to-report partial-sums [lst]
report butfirst reduce [[result-so-far next-item] -> lput (next-item + last 
result-so-far) result-so-far] fput [0] lst
end
于 2018-04-13T14:59:23.503 回答
0

这就像艾伦的解决方案,只是进一步抽象了一点。(也许太过分了,取决于你的口味!我也喜欢 JenB 的解决方案。)

让我们首先定义一个类似 的东西reduce,但它保留了所有中间结果:

to-report scan [fn xs]
  report reduce [lput (runresult fn ?2 last ?1) ?1]
                (fput (list first xs) butfirst xs)
end

现在我们可以用它来计算部分和:

observer> show scan task + [1 2 3 4 5]
observer: [1 3 6 10 15]

但我们也可以自由地交换不同的操作:

observer> show scan task * [1 2 3 4 5]
observer: [1 2 6 24 120]
于 2015-11-07T05:14:40.347 回答