找到第一个元素后跟相同的 n 个元素
find first element followed n elements of same
如何在列表中找到第一个零的索引,后面跟着 5 个零?如果不存在这样的零 return -1。
Netlogo 仅 return 是在具有 position
的列表中找到的第一个元素,这使得它成为 difficult/cumbersome.
我找到了可能的解决方案。也许有更聪明的方法来实现同样的目标,但至少这种方法应该有效。
您定义一个列表,您要查看的序列的长度和序列应该具有的编号。然后用该信息调用报告函数(检查序列)。
报告函数然后使用 while 循环。它采用下一个 length-of-sequence
个元素并按指定的 number-of-interest
过滤此子列表。如果此筛选列表的长度与指定的 length-of-sequence
相同,则该函数将存储整个列表 (i
) 上的实际位置。如果不是,列表的第一个元素将被丢弃,循环再次运行。如果列表中没有足够的元素,循环将停止并将 reporter 设置为 -1。否则会报告序列的起始位置。
to go
let my-list (list 0 1 2 3 0 0 0 8 9 8)
let length-of-sequence 4
let number-of-interest 0
print check-sequence my-list length-of-sequence number-of-interest
end
to-report check-sequence [a-list sequence number]
let i 0
let stopper 0
let reporter 0
while [stopper = 0]
[
let filtered_sublist filter [? = number] (sublist a-list 0 sequence)
if (length filtered_sublist = sequence)
[
set reporter i
set stopper 1
]
set a-list but-first a-list
set i (i + 1)
if (length a-list < sequence)
[
set stopper 2
]
]
ifelse (stopper = 2)
[ report -1 ]
[ report reporter ]
end
在问题中你说如果没有找到你想要 -1
,但这与 NetLogo 自己的 position
原语的行为不匹配,returns false
如果找不到该项目。我建议坚持使用通常的 NetLogo 惯例。
递归求解:
to-report position-of-six-zeros [xs]
if length xs < 6
[ report false ]
if sublist xs 0 6 = [0 0 0 0 0 0]
[ report 0 ]
let recurse position-of-six-zeros butfirst xs
if not is-number? recurse
[ report recurse ]
report 1 + recurse
end
样本运行:
observer> show position-of-six-zeros [0 0 0 0 0]
observer: false
observer> show position-of-six-zeros [0 0 0 0 0 0 ]
observer: 0
observer> show position-of-six-zeros [1 2 3 0 0 0 0 0 0 4 5 6]
observer: 3
observer> show position-of-six-zeros [1 2 3 0 0 0 0 0 4 5 6]
observer: false
如何在列表中找到第一个零的索引,后面跟着 5 个零?如果不存在这样的零 return -1。
Netlogo 仅 return 是在具有 position
的列表中找到的第一个元素,这使得它成为 difficult/cumbersome.
我找到了可能的解决方案。也许有更聪明的方法来实现同样的目标,但至少这种方法应该有效。
您定义一个列表,您要查看的序列的长度和序列应该具有的编号。然后用该信息调用报告函数(检查序列)。
报告函数然后使用 while 循环。它采用下一个 length-of-sequence
个元素并按指定的 number-of-interest
过滤此子列表。如果此筛选列表的长度与指定的 length-of-sequence
相同,则该函数将存储整个列表 (i
) 上的实际位置。如果不是,列表的第一个元素将被丢弃,循环再次运行。如果列表中没有足够的元素,循环将停止并将 reporter 设置为 -1。否则会报告序列的起始位置。
to go
let my-list (list 0 1 2 3 0 0 0 8 9 8)
let length-of-sequence 4
let number-of-interest 0
print check-sequence my-list length-of-sequence number-of-interest
end
to-report check-sequence [a-list sequence number]
let i 0
let stopper 0
let reporter 0
while [stopper = 0]
[
let filtered_sublist filter [? = number] (sublist a-list 0 sequence)
if (length filtered_sublist = sequence)
[
set reporter i
set stopper 1
]
set a-list but-first a-list
set i (i + 1)
if (length a-list < sequence)
[
set stopper 2
]
]
ifelse (stopper = 2)
[ report -1 ]
[ report reporter ]
end
在问题中你说如果没有找到你想要 -1
,但这与 NetLogo 自己的 position
原语的行为不匹配,returns false
如果找不到该项目。我建议坚持使用通常的 NetLogo 惯例。
递归求解:
to-report position-of-six-zeros [xs]
if length xs < 6
[ report false ]
if sublist xs 0 6 = [0 0 0 0 0 0]
[ report 0 ]
let recurse position-of-six-zeros butfirst xs
if not is-number? recurse
[ report recurse ]
report 1 + recurse
end
样本运行:
observer> show position-of-six-zeros [0 0 0 0 0]
observer: false
observer> show position-of-six-zeros [0 0 0 0 0 0 ]
observer: 0
observer> show position-of-six-zeros [1 2 3 0 0 0 0 0 0 4 5 6]
observer: 3
observer> show position-of-six-zeros [1 2 3 0 0 0 0 0 4 5 6]
observer: false