我想獲取一個整數列表並創建一個整數列表,它們位於前列表中的整數之間(或間隔內)。例如,我想?- findmissing([1,3,4,5,6],X).
導致X = [2]
。我將如何實現這樣的功能?查找缺少的整數 - Prolog
0
A
回答
3
邏輯編程的第一個竅門是從最小的情況開始並進行處理。
這裏的基本情況很容易,如果列表中少於兩個元素,沒有什麼缺失。
findmissing([], []).
findmissing([_], []).
第二招是分而治之。爲了找到列表中每對之間缺失的所有東西,我們需要一個謂詞(比如(X,Y,List)/ 3)中的數字,它給出給定數字對之間的所有數字,然後在每個數字對在輸入列表中配對。使用內置的append()/ 3,而不是令人擔憂的有關如何實現numbersbetween()/ 3的那一刻,我們就可以把:
findmissing([X, Y|In], Out) :-
numbersbetween(X, Y, Between),
findmissing([Y|In], After),
append(Between, After, Out).
(有一點這裏的照顧,以確保我們考慮每一對,在列表[1,2,3]中,我們需要檢查[1,2]和[2,3] - 這就是爲什麼recusive步驟不僅僅需要In [Y | In])。
那麼只剩下在()/ 3之間定義數字的挑戰。如果您碰巧知道()/ 3(如果X < Z < Y爲true)和setof()/ 3(它可以從所有解決方案生成列表)之間的內置謂詞,則可以使用:
numbersbetween(X, Y, List) :- setof(B, between(X, Y, B), List).
如果您不知道這些函數,您可以使用Prolog的算術「is」在()之間構造自己的數字。
0
康拉德歐文在這裏給出了遞歸解決問題的一個很好的分析,但假設輸入列表按升序排序(Hunterhod示例中就是這種情況)。
關於未分類輸入的可能性的思考提出了一種方法,除了在應用康拉德技術之前對輸入進行分類之外。
找到
InputList
的Minimum
和Maximum
元素。創建連續整數列表
BetweenList = [Minimum,...,Maximum]
。從BetweenList
提取的所有條目不是
InputList
成員形成MissingList
。
相關問題
- 1. js缺少整數
- 2. 查找缺少的函數定義
- 3. 查找數組中缺少的元素
- 4. 查找序列中缺少的數字
- 5. 在Timesstamp中查找缺少的數據
- 6. 如何查找缺少的數據
- 7. 數組中缺少整數
- 8. Android查找缺少號碼
- 9. Prolog查找N個素數
- 10. 查找缺少的序列號
- 11. 查找缺少的@Test註釋
- 12. 使用ELK查找缺少的日誌
- 13. 在Netsuite中查找缺少的發票
- 14. 查找缺少的屬性表 - Mysql
- 15. SQL Server 2008查找缺少的行
- 16. 數組 - 在序列中查找缺少的數字
- 17. 如何在數組或mySQL表中查找缺少的數據?
- 18. 從數組中查找缺少的數字
- 19. 在Xcode 3.2中缺少「查找選項」
- 20. 用CMake查找Qt:缺少moc,uic,rcc
- 21. 查找DISTINCT缺少SQL依賴關係
- 22. 查找月似乎缺少文件
- 23. 查找線路缺少一個支架
- 24. 查找排序的數組中缺少的元素
- 25. SWI-Prolog查找X的值
- 26. 查找Prolog的謂詞
- 27. 尋找缺少的.bash_profile
- 28. 查找數組中缺失整數的最有效方法
- 29. 查找數組中的最小缺失整數
- 30. Mysql,在一個序列中查找缺少的數字