2012-01-31 177 views
3

所以我在這個程序掙扎,我試圖找出如何使用一個 聲明爲main的指針數組,在遞歸函數中記住數據, 出現的問題這裏是如果它是一個單一的指針相同的方法,那麼對於一個結構類型呢? 通過引用變量/數組傳遞給遞歸函數的最佳方式是什麼?c傳遞指針遞歸函數

#include <stdio.h> 
#include <stdlib.h> 
#define N 1 

void f(int i,int j,int *cnt); 

int j=0; 

int main(int argc, char *argv[]) 
{ 
    int *cnt=0; 
    f(0,++j,&cnt); 
    printf("------ %d ---- \n",cnt); 
    system("PAUSE"); 
    return 0; 
} 

void f(int i,int j,int *cnt){ 

    if(i>N){ 
      printf("---if --- %d ---- %d \n",i,j); 
      (*cnt)++; 
      return; 
      } 

    (*cnt)++; 
    printf("---bg --- %d ---- %d \n",i,j); 
    f(i+1,++j,cnt); 
    f(i+1,++j,cnt);   
} 

我想知道的另一件事情是怎麼做的遞歸函數處理++ i和i ++和i + 1度的增量(當作爲參數傳遞),

+0

該代碼將無法編譯。你還沒有初始化'cnt'指向任何內存。 – 2012-01-31 00:49:40

回答

4
int main(int argc, char *argv[]) 
{ 
    int *cnt=0; 
    f(0,++j,&cnt); 
    printf("------ %d ---- \n",(*cnt)); 
    system("PAUSE"); 
    return 0; 
} 

需求是

int main(int argc, char *argv[]) 
{ 
    int intStorage = 0;//<---- As Oli said. 
    int *cnt= &intStorage; 
    f(0,++j,cnt);//<-------AMPERSAND removed, overly dereferenced. 
    printf("------ %d ---- \n",(*cnt)); 
    system("PAUSE"); 
    return 0; 
} 

++ i和i ++和i + 1(當作爲參數傳遞):

  1. ++ i:i + 1已通過,同時也是我以後的價值。
  2. i ++:在通話結束後我通過了i = i + 1。
  3. 我+ 1:我+ 1通過,但我仍然只是我之後。

我試試給你的功能也一點點:

void f(int i,int j,int *cnt){ 

    if(i>N){ 
     printf("---if --- %d ---- %d \n",i,j); 
     return; 
    } 

    (*cnt)++; 
    printf("---bg --- %d ---- %d \n",i,j); 
    if (i < 50 && j < 50) { 
     f(i+1,++j,cnt); 
     f(i+1,++j,cnt); 
    } 
} 

還有很多遞歸的,但沒有不停止的危險。

+0

確實。但是這個代碼仍然會導致seg-fault。 – 2012-01-31 00:52:49

+0

我沒有意識到遞歸函數也需要工作。哦,他們只是在無限遞歸中堆積起來。 – John 2012-01-31 00:56:14

+0

你應該得到一個編譯警告 - 在main()調用'f()'的參數3的類型不匹配。你正在傳遞一個'int **',其中函數需要一個'int *'。 – 2012-01-31 01:03:50

2

處理指針到您的功能的簡單方法是:

#include <stdio.h> 
#include <stdlib.h> 
#define N 1 

void f(int i, int j, int *cnt); 

int j = 0; 

int main(void) 
{ 
    int cnt = 0; 
    f(0, ++j, &cnt); 
    printf("------ %d ----\n", cnt); 
    return 0; 
} 

void f(int i, int j, int *cnt) 
{ 
    // Having a local variable j and a global j is likely to confuse someone! 
    if (i > N) 
    { 
     printf("---if --- %d ---- %d\n", i, j); 
     return; 
    } 

    (*cnt)++; 
    printf("---bg --- %d ---- %d\n", i, j); 
    f(i+1, ++j, cnt); 
    f(i+1, ++j, cnt); 
} 

此代碼生成沒有崩潰的輸出如下:

---bg --- 0 ---- 1 
---bg --- 1 ---- 2 
---if --- 2 ---- 3 
---if --- 2 ---- 4 
---bg --- 1 ---- 3 
---if --- 2 ---- 4 
---if --- 2 ---- 5 
------ 3 ----