2013-07-21 101 views
2

我在做其他練習,我必須:下循環轉換爲while循環和遞歸

「寫一個遞歸函數打印所有解決八個皇后棋的問題,返回的數量解決方案和功能原型必須是:INT功能(無效)

上班我以前靜態變量沒有參數規則周圍

我已經完成了它(與谷歌的幫助),它的工作原理,但他們不允許使用for循環,由於某些原因,我無法設法將最後兩個for循環轉換爲while循環。

它讓我瘋狂,應該很容易!我認爲這是遞歸是搞砸了......

這裏的工作職能:

int function() 
{ 
    static int count = 0; 
    static int col = 0; 
    const int n = 8; 
    static int hist[8] = {10, 10, 10, 10, 10, 10, 10, 10}; 
    int i1 = 0; 

    if (col == n) { 
     count++; 
     while (i1++ < n) 
     { 
      putchar('0' + hist[i1-1] + 1); 
     } 
     putchar('\n'); 
    } 

    for (int i = 0; i < n; i++) { 
     int j = 0; 
     for (j = 0; j < col && !(hist[j] == i || (hist[j] - i) == col - j || -(hist[j] - i) == col - j); j++); 

     if (j < col) { 
      continue; 
     } 
     hist[col] = i; 
     col++; 
     function(); 
     col--; 
    } 
    return count; 
} 

而且我想最後兩個for循環轉換爲while循環是這樣的:

int i = 0; 
while (i < n) 
{ 
    int j = 0; 
    while (j < col && !(hist[j] == i || (hist[j] - i) == col - j || -(hist[j] - i) == col - j)) 
    { 
     j++; 
    } 

    if (j < col) { 
     continue; 
    } 
    hist[col] = i; 

    col++; 
    function(); 
    col--; 
    i++; 
} 

但它不起作用,是否有比看起來更多的for循環?我是新遞歸,我以爲我明白了,但它似乎我錯了...

+0

'for'到'while'轉換部分對我來說似乎是正確的。這是你改變的唯一的東西嗎? – Mahesh

+0

是的,它是所有的問題,你可以嘗試它,第一個工程,但第二個不工作:/ – ItsASecret

+0

所以,你只改變了最後的'for'循環,保持原樣。我希望你保留了回覆聲明。 – Mahesh

回答

1

我跑了代碼,發現問題。它與線

if (j < col) { 
    continue; 
} 

,因爲這不是一個continue語句都到了for循環,你必須增加在這種情況下i爲好。

if (j < col) { 
    i++;  // add this line 
    continue; 
} 
+0

omg我完全錯過了!非常感謝你 ! – ItsASecret

+0

這是什麼StackExchange是關於:) – levengli

1

你可以第一個循環改變

while(i++<n) 

,它工作正常。