2015-09-27 214 views
0

如何找到第一個零的索引,後面跟着5個零在列表中?如果不存在這樣的零,則返回-1。 Netlogo只返回在position列表中找到的第一個元素,這使得它很困難/繁瑣。找到第一個元素後跟n個元素相同

+1

所以,你要的6個零列表中的第一序列的開始? – JenB

+0

是的。 。 –

回答

3

在這個問題你說你要回來-1如果沒有找到它,但不匹配的行爲的NetLogo自己position原始,如果沒有找到該項目返回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 
1

我找到了一個可能的解決方案。也許有更聰明的方法來達到同樣的效果,但至少這種方法應該可行。 您可以定義一個列表,您要查看的序列的長度以及序列應具有的編號。然後你用這個信息調用記者功能(check-sequence)。 記者函數然後使用一個while循環。它將採用下一個length-of-sequence元素並按指定的number-of-interest過濾此子列表。如果此過濾列表的長度與指定的length-of-sequence相同,則該函數將存儲整個列表上的實際位置(i)。如果不是,列表的第一個元素將被刪除,循環再次運行。如果列表中沒有足夠的元素,循環將停止並將記錄器設置爲-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 
相關問題