2015-11-24 102 views
0

尋找基於前一個問題答案幫助選擇下一個問題的算法。例如:如果第一個問題是 1.您是否擁有智能手機? 如果有的話 2.它有什麼類型的傳感器?算法 - 根據前一個查詢選擇下一個查詢

如果沒有 2.您想購買哪款智能手機?

這些問題的分支應基於最後一個問題並回答。 有哪些技巧可以用來推導這一點。任何通用算法都可用於此目的。

+0

請參閱http://meta.stackexchange.com/questions/165519/where-should-i-post-questions-about-algorithms-stack-overflow-or-programmers-se – Evert

+0

這與算法無關。您保留一組(問題,答案,下一個問題)s.t.每當收到答案時,請查看下一個問題,然後繼續。 –

+0

@KenCheung是(Q,A,NQ)的格式很好。這種表示問題和答案的方式可以是圖形數據庫中的節點路徑節點。希望NEO4J的實施可能會有同樣的效果。 – shrik

回答

0

您必須決定是否應該詢問問題。這是一種方法。我沒有提供QuestionContext,這是你的工作,決定如何存儲答案,並根據這個問題決定問題是否可用。

我很想用next()問題的方法,但有時你需要更多的上下文(即如果你擁有智能手機&智能手機來自蘋果,請問什麼版本的iOS正在運行)。

希望這會有所幫助!

interface Question { 
    public boolean isAvailable(QuestionContext ctx); 
    public void ask(); 
    // ... rest of the methods 
} 

public class Questionnaire implements QuestionContext { 
    private Question[] qs; 

    // constructors, getters, etc. 

    public void ask() { 
    for (Question q : qs) { 
     if (q.isAvailable(this)) { 
     q.ask(); 
     } 
    } 
    } 
} 

p.s.如果你需要更復雜的東西,有一些流程框架可用於各種任務,但你必須明白並提出可滿足你需求的東西。一個例子是Spring WebFlow,它在一個嚮導式頁面上下文中決定下一個頁面。

+1

通常在代碼級別,這看起來很好,但下一個問題需要考慮回答。正如您所指出的那樣,需要根據答案構建分支鏈問題。結賬Spring WebFlow將對此提供幫助。 – shrik