全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:932
推到 Plurk!
推到 Facebook!

程式追蹤

尚未結案
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-20 17:59:10 IP:59.104.xxx.xxx 未訂閱
void permute(char a[], int k, int input_var)
{
    int i,j, inversion=0;
    char temp;
    if ( k == input_var )
    {
        printf("(");
        for ( i=1; i<input_var; i   )
            printf(" %d,",a[i]);
        printf(" %d )",a[i]);            for ( i=1; i<=input_var; i   )
            for ( j = i 1; j<=input_var; j  )
                if (a[i] > a[j])
                    inversion  ;            printf(" Inversion = -, ",inversion);
        if ( (inversion %2) == 1 )
            printf("odd  permutation.\n");
        else
            printf("even permutation.\n");
    }
    else
    {
        for ( i=k; i<=input_var; i  )
        {
            temp=a[k]; a[k]=a[i]; a[i]=temp;
            permute ( a, k 1, input_var);
            temp=a[k]; a[k]=a[i]; a[i]=temp;
        }
    }
}    int main(int argc, char* argv[])
{
    int i, input_var;
    char setofnumber[10], ch;        for (i=0; i<10; i  )                    permute ( a, k 1, input_var);
            temp=a[k]; a[k]=a[i]; a[i]=temp;
        }
    }
}    int main(int argc, char* argv[])
{
    int i, input_var;
    char setofnumber[10], ch;        for (i=0; i<10; i  )
        setofnumber[i]=i;        printf("Please input the number of entries to permute\n");
    scanf("%d",&input_var);
    permute(setofnumber, 1, input_var);        return 0;
}    上面是完整程式碼    ____________________________________________________________________
下面這程式是怎麼跑的~~可以跟我說明一下    好像是利用遞迴嗎??    void permute(char a[], int k, int input_var)
{
    int i,j, inversion=0;
    char temp;
    if ( k == input_var )
    {
        printf("(");
        for ( i=1; i<input_var; i   )
            printf(" %d,",a[i]);
        printf(" %d )",a[i]);            for ( i=1; i<=input_var; i   )
            for ( j = i 1; j<=input_var; j  )
                if (a[i] > a[j])
                    inversion  ;            printf(" Inversion = -, ",inversion);
        if ( (inversion %2) == 1 )
            printf("odd  permutation.\n");
        else
            printf("even permutation.\n");
    }
    else
    {
        for ( i=k; i<=input_var; i  )
        {
            temp=a[k]; a[k]=a[i]; a[i]=temp;
            permute ( a, k 1, input_var);
            temp=a[k]; a[k]=a[i]; a[i]=temp;
        }
    }
}    
發表人 - syao 於 2005/03/20 18:03:13
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-20 20:35:52 IP:221.169.xxx.xxx 未訂閱
是利用遞迴
for ( i=k; i<=input_var; i  )
{
temp=a[k]; a[k]=a[i]; a[i]=temp;
permute ( a, k 1, input_var);
temp=a[k]; a[k]=a[i]; a[i]=temp;
}
紅色那段。自己呼叫自己。 你自己再追看看何時要再進入遞迴。 遞迴的返回條件。 就可以了解了。 PS。你的程式我沒全看。你得自己追程式。^_^
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-20 20:54:04 IP:59.104.xxx.xxx 未訂閱
    for ( i=k; i<=input_var; i  )
{
temp=a[k]; a[k]=a[i]; a[i]=temp;
permute ( a, k 1, input_var);

temp=a[k]; a[k]=a[i]; a[i]=temp; //為什麼還再要加上這行    }    我懂這是藉由遞迴在跑~~    不過我不太懂遞迴是怎麼跑的~~遞迴是靠stack存放嗎???
&這程式遞迴終止條件是什麼??    遇到終止不是還要從stack中再返回~~他返回的步驟大概是怎樣的??     
Fm
初階會員


發表:19
回覆:66
積分:37
註冊:2003-10-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-20 21:47:13 IP:61.62.xxx.xxx 未訂閱
妳好 這程式遞迴終止條件是什麼??--  
 
{
.............    }        else
    {
        
for ( i=k; i<=input_var; i  )            {
            temp=a[k]; a[k]=a[i]; a[i]=temp;
            permute ( a, k 1, input_var);
            temp=a[k]; a[k]=a[i]; a[i]=temp;//當這裡在做排列的動作
        }
    }    
當i>input_var遞回就終止了.. //妳可以自己設中斷點(Ctrl F5)..然後按F8慢慢trace程式 //觀察i,k,變數(Ctrl F5),應該可以得到你要的答案 //以上是BCB的操作方式 //------------------- 原來喜歡一個人是很辛苦的
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-20 22:00:51 IP:59.104.xxx.xxx 未訂閱
我用VC7.0要怎麼使用中斷點追蹤??? 謝謝
Fm
初階會員


發表:19
回覆:66
積分:37
註冊:2003-10-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-20 22:46:27 IP:61.62.xxx.xxx 未訂閱
妳好.... 映象中是這樣的 F9:設中斷 F10:不進入函式 F11:逐步執行 Ctrl+Shit+F9:清除所有中斷 F5:啟動 Crtl+F5:啟動但不偵錯 希望對妳有幫助 //----------- 其實買一本手冊來看比較完整也比較快.. //------------------- 原來喜歡一個人是很辛苦的
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-20 22:47:02 IP:203.69.xxx.xxx 未訂閱
你的是 VC??? 那只好去問M$了。^_^ 一個問題5000元。 不然就去看看HELP怎麼寫吧。 http://www.mcu51.com/list.asp?id=1588 想想別人怎麼學,我們有這麼用心嗎? 憂心啊~~~~~~
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-21 01:25:33 IP:59.104.xxx.xxx 未訂閱
    
    Please input the number of entries to permute
3
k=1,i=1
k=2,i=2
( 1, 2, 3) Inversion =  0, even permutation.
k=2,i=2
k=2,i=3
( 1, 3, 2) Inversion =  1, odd  permutation.
k=2,i=3
k=1,i=1
k=1,i=2
k=2,i=2
( 2, 1, 3) Inversion =  1, odd  permutation.
k=2,i=2
k=2,i=3
( 2, 3, 1) Inversion =  2, even permutation.
k=2,i=3
k=1,i=2
k=1,i=3
k=2,i=2
( 3, 2, 1) Inversion =  3, odd  permutation.
k=2,i=2
k=2,i=3
( 3, 1, 2) Inversion =  2, even permutation.
k=2,i=3
k=1,i=3
請按任意鍵繼續 . . .    這我追蹤k&i的變化
加了下面紅色兩行來追蹤    for ( i=k; i<=input_var; i  )
{   
            
   printf("k=%d,i=%d\n",k,i); 
   temp=a[k]; a[k]=a[i]; a[i]=temp;                        
   permute ( a, k 1, input_var);           
   temp=a[k]; a[k]=a[i]; a[i]=temp;
   printf("k=%d,i=%d\n",k,i);  
}        我還是搞不懂遞迴控制權的是怎麼還原的    k=3
( 1, 2, 3) Inversion =  0, even permutation.
這邊可以看懂~~    那之後是不是遞迴把k變回=2???
那k=2是又從void permute{}從起執行嗎???我這樣看起來怪怪的~~@@    還是遞迴還原k=2是從下面這邊執行但我還是看不懂&如果從遞迴還原從這邊開始(1,3,2)好像是~~但(2,1,3)這邊我又搞不懂是如何變出來的@@ 
for ( i=k; i<=input_var; i  )
        {
            temp=a[k]; a[k]=a[i]; a[i]=temp;
            permute ( a, k 1, input_var);
       temp=a[k]; a[k]=a[i]; a[i]=temp; 
        }        
pkdemon
初階會員


發表:2
回覆:51
積分:25
註冊:2004-09-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-03-22 14:39:51 IP:60.248.xxx.xxx 未訂閱
syao 你好,    感覺上你似乎不太清楚遞迴的運作,建議加上一個Counter來幫助了解(下面紅色處)    另外,這個程式是要把一個字串反轉嘛??    
 
void permute(char a[], int k, int input_var, int Counter)
{
    int i,j, inversion=0;
    char temp;
    printf("Counter = %d\n", Counter);
    if ( k == input_var )
    {
        ........
    }
    else
    {
        for ( i=k; i<=input_var; i  )
        {
            temp=a[k]; a[k]=a[i]; a[i]=temp;
            permute ( a, k 1, input_var, Counter   1);
            temp=a[k]; a[k]=a[i]; a[i]=temp;
        }
    }
}    int main(int argc, char* argv[])
{
    ........
    permute(setofnumber, 1, input_var, 0);
    ........
}    
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-03-22 15:03:09 IP:59.104.xxx.xxx 未訂閱
pkdemon您好:    這程式是要把數值所有排列組合數都顯示出來~~
例如輸入:3    會印出
(1,2,3)
(1,3,2)
(2,1,3)
(2,3,1)
(3,1,2)
(3,2,1)    ___________________________________________
沒錯我對遞迴關係不是很清楚~~
我只知道遞迴是以stack方式達成~
至於剛到達終止條件要在返回上一層呼叫的值這怎麼跑我這懂不太懂    遞迴終止後回上層呼叫void re(int a)不在從這開始嗎??    只是這行開始執行嗎???cout<
using namespace std;    void re(int);    int main()
{
    
    
    re(4);
            system("pause");
    return 0;    
    
}    void re(int a)
{
    cout<<"countdown down....."<0)   
        re(a-1);
        
    cout<     
        
pkdemon
初階會員


發表:2
回覆:51
積分:25
註冊:2004-09-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-03-22 16:27:18 IP:60.248.xxx.xxx 未訂閱
syao您好,    其實程式在跑的流程都是一樣的,而遞迴只不過是一個function中有呼叫到自己的方式被稱為遞迴.    所以當中只條件滿足時,會回傳給呼叫他的上一層,依序迴傳回去.....    以下這個例子應該可以幫助您對於遞迴的了解  
void a(int n)
{
    if (n>0)
    {
        a(n - 1);
        printf("%d\n", n);
    }
}    int main()
{
    a(10);
}     
系統時間:2024-05-19 16:00:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!