c#
  • recursion
  • 2015-04-01 133 views 0 likes 
    0

    我試圖讓這個函數中的參數...遞歸函數得到一個參數

    public static int subsumer(string id,int acc,SqlConnection connection) 
    { 
        acc++; 
        SqlCommand cercas = new SqlCommand("select * from common_relation where id_source ='" + id + "' AND type='@' ", connection); 
        SqlDataReader leggsyn = null; 
        leggsyn = cercas.ExecuteReader(); 
    
        int f = 0; 
        while (leggsyn.Read()) 
        { 
         f= subsumer(leggsyn["id_target"].ToString(),acc,connection); 
         if (acc <= f) 
         { 
          acc = f; 
         } 
        } 
    
        //siamo arrivati alla fine 
        return acc-1; 
    } 
    

    每個週期參數acc將遞增和調試我看到在我的情況下,它達到值3 ,但在最後遞歸我總是0 ...我無法得到它...謝謝大家

    +0

    你是什麼意思'參數'?此外,爲什麼你使用字符串連接而不是使用正確的參數化查詢?輸入中的一個奇怪的字符會導致問題。更有趣的輸入可能是'1; DROP TABLE COMMON_RELATION;'' – 2015-04-01 14:29:53

    +4

    你是如何調用函數的?你有沒有在調試器中檢查它,確保你的邏輯是正確的? – 2015-04-01 14:31:16

    +0

    你的功能假設要做什麼?總數還是最大值? ,因爲我看到你的循環中只有分配 沒有增量 – 2015-04-01 14:43:44

    回答

    1

    通過返回acc - 1,遞歸調用返回f,我不認爲這就是你的期望。

    public static int subsumer(string id,int acc,SqlConnection connection) 
    { 
        SqlCommand cercas = new SqlCommand("select * from common_relation where id_source ='" + id + "' AND type='@' ", connection); 
        SqlDataReader leggsyn = null; 
        leggsyn = cercas.ExecuteReader(); 
    
        int f = 0; 
        while (leggsyn.Read()) 
        { 
         f= subsumer(leggsyn["id_target"].ToString(),acc + 1,connection); 
         if (acc <= f) 
         { 
          acc = f; 
         } 
        } 
    
        //siamo arrivati alla fine 
        return acc; 
    } 
    

    在附註中,遞歸查詢不是一個好的設計選擇。對於堆棧中的每個調用打開的讀者遞歸地查詢更加糟糕。不使用查詢參數也是一件壞事。

    +0

    好吧,現在我終於明白了!我知道遞歸查詢不是一個很好的選擇,我不是一個專家開發人員,我面臨與wordnet和一些其他的東西,它不適當的「你好世界」的句子相似性。 我如何使用查詢參數? – Lorenzo 2015-04-01 15:06:51

    +0

    只是谷歌,很多關於它的東西。 – 2015-04-01 15:10:34

    +0

    @Lorenzo,搜索現有問題或發佈一個包含您的查詢的新問題,並詢問您如何對其進行參數化。 – Guillaume 2015-04-01 15:39:28

    2

    你需要通過引用acc。即使用:public static int subsumer(string id,ref int acc,SqlConnection connection) {

    +6

    該函數返回'acc-1'因此不應該需要使用'ref'(除非OP調用不正確)。 – 2015-04-01 14:30:53

    +0

    我這麼叫 int fuffa = DistanzaParole.subsumer(「n#00004123」,0,連接); – Lorenzo 2015-04-01 14:45:53

    0

    該方法在開始時遞增,並在最後遞減,因此看起來您總是會以acc的初始呼叫值(在您的情況下爲0)結束。

    +0

    它不應該增加: f = subsumer(leggsyn [「id_target」]。ToString(),acc,connection); if(acc <= f) { acc = f; }? – Lorenzo 2015-04-01 14:52:46

    +0

    當acC++時它會增加,然後當沒有記錄時,它會返回acc--,這意味着它會返回相同的值。 – 2015-04-01 14:58:31

    相關問題