有没有办法在映射过程中使用 if 语句?

问题描述 投票:0回答:1

我想根据另外两个名为

list1
list2
的列表中的值更新名为
list3
的列表中的几个值。基本上,
list2
中的值确定模型应使用哪个方程来更新
list1
中的值,而
list3
中的值用于这些方程中。

一个工作示例是:

turtles-own [list1 list2 list3]

to setup
  clear-all
  setup_turtles
  reset-ticks
end

to setup_turtles
  create-turtles 10
  [
    set list1 n-values 20 [1]
    set list2 n-values 20 [0 + random 3]
    set list3 n-values 20 [-0.5 + random-float 1]
  ]
end

to go
  ask turtles[ update_list1 ]
  tick
end

to update_list1
  set list1 (map [[b c] ->
    if (b = 0) [ 1 + c ]
    if (b = 1) [ 1 - c ]
    if (b = 2) [ 1 - c / 2 ]
  ] list2 list3)
end

Netlogo 告诉我它需要

if
语句中的命令,考虑到 if 函数的构建方式,这是有道理的。我想知道他们是否是一种可以解决这个问题的解决方法。

我尝试在 update_list1 过程中使用

ifelse-value
函数而不是
if
并且它有效(见下面的代码)

to update_list1
  set list1 (map [[b c] ->
    ifelse-value (b = 0) [ 1 + c ] [
      ifelse-value (b = 1) [ 1 - c ][
        1 - c / 2
      ] 
    ] 
  ] list2 list3)
end

但是,稍后我计划在 list2 中有 3 个以上的不同值,我想避免连续多次调用

ifelse-value
导致的多重缩进。

list dictionary if-statement command netlogo
1个回答
2
投票

Netlogo 可以选择对

ifelse
ifelse-value
的一次调用使用多个布尔值。为此,您需要将整个表达式放在圆括号中:
(ifelse-value boolean1 [ reporter1 ] boolean2 [ reporter2 ] ... [ elsereporter ])
。 这确保您不必使用嵌套的
ifelse-value
's

to update_list1
  set list1 (map [[b c] ->
    (ifelse-value
        b = 0 [ 1 + c ]
        b = 1 [ 1 - c ]
        b = 2 [1 - c / 2]
              [print "b is not one of the expected values"]
    ) 
  ] list2 list3)
end
© www.soinside.com 2019 - 2024. All rights reserved.