2014-11-05 67 views
-1

假設我在C以下功能:遞歸使用局部變量,這是一個「功能部件」纔可見

#include <stdio.h> 
int sum(int n); 
int main(){ 
    int num,add; 
    printf("Enter a positive integer:\n"); 
    scanf("%d",&num); 
    add=sum(num); 
    printf("sum=%d",add); 
} 
int sum(int n){ 
    int temp; 
    temp += 2; 
    printf("Temp is : %i", temp); 
    if(n==0) 
     return n; 
    else 
     return n+sum(n-1); /*self call to function sum() */ 
} 

我的問題是,我只希望做temp += 2;中的第一級循環。所以我希望它只是第一個循環的總和,而不是所有被調用的和函數本身。所以爲了讓問題更清楚一點:在遞歸函數中定義的變量只是遞歸「樹」的第一部分的局部變量?這很難解釋我的問題,所以請問,如果你不明白請。謝謝!

編輯:總結添加printf。所以我想有輸出的幾倍: 溫度爲:2 溫度爲:2

但我認爲這會發生是這樣的:

溫度爲:2 溫度是:4 etc ...

編輯2:對於想要嘗試硬編碼的人,在這裏是:(我的問題其實是,只要聲明ar_in[i]+ space_fill == lw && used[i] == 0是真的,我想執行所有在那之後陳述的if聲明,直到return 1;然後一路返回到函數search_ COMBI。注意:ar_in []數組是幾個數字的陣列,例如{10,80,70,60,80})

bool search_combi(int ar_in[], int index){ 
    if (ar_in[index] == lw){ 
     used[index] = 1; 
     comb[combcount][0] = index; 
     return 1; 
    } else{ 
     tempcomb[0] = index; 
     tempcombcount++; 
     space_fill = ar_in[index]; 
     //search right of element 
     search_right(index+1, ar_in); 
     return 0; 
    } 

} 

int search_right(int start, int ar_in[]){ 
    int i, j; 
    int temp_space_fill = space_fill; 
    printf("Tempspace = %i \n", temp_space_fill); 
    if(choose == 1) { 
     choose = 0; 
     return 1; 
    } 
    if(start == cn){ 
     return 1; 
    }else{ 
     for(i = start; i < cn; i++){ 
      space_fill = temp_space_fill; 
      if(choose == 1) { 
       break; 
      } 
      if (ar_in[i] + space_fill == lw && used[i] == 0){ 
       tempcomb[tempcombcount] = i; 
       for(j = 0; j <= tempcombcount; j++){ 
        comb[combcount][j] = tempcomb[j]; 
        used[tempcomb[j]] = 1; 
       } 
       combcount++; 
       memset(tempcomb, 0 , sizeof(tempcomb)); 
       tempcombcount = 0; 
       space_fill = 0; 
       temp_space_fill = 0; 
       choose = 1;    
       return 1; 
      } else if (ar_in[i] + space_fill < lw && used[i] == 0){ 
       space_fill += ar_in[i]; 
       tempcomb[tempcombcount] = i; 
       tempcombcount++; 
      } 
      search_right(i+1, ar_in); 
     } 

    } 
    return 1; 
} 
+0

此代碼中未使用此局部變量。因此,展示一個你確實需要一個局部變量的例子。 – 2014-11-05 17:22:50

+0

和'int temp; temp + = 2;'嗯。你認爲你將「2」*添加到*是什麼? – WhozCraig 2014-11-05 17:30:35

+0

局部變量'temp'未初始化爲任何內容。使用未初始化的變量執行數學運算是未定義的行爲。 – user3629249 2014-11-05 18:32:30

回答

0

的一般方法是使用局部變量與靜態存儲持續時間。在第一次遞歸調用時,它等於例如零。如果它等於零,則將其設置爲某個值。所有其他遞歸調用檢查變量是否等於零。如果沒有,那麼他們不會改變它。當遞歸結束時,您需要將此變量重新設置爲零。

下面是一個例子

int sum(int n) 
{ 
    static int temp; 

    if (temp == 0) temp += 2; 

    printf("Temp is : %i", temp); 

    if (n == 0) 
    { 
     return temp = 0; 
    } 
    else 
    { 
     return n + sum(n-1); /*self call to function sum() */ 
    } 
} 

下面是一個更interestoing示例

#include <stdio.h> 

unsigned int sum(unsigned int n, char c) 
{ 
    static char dot; 

    if (dot == 0) dot += c; 

    printf("%c", c); 

    if (n == 0) 
    { 
     return dot = 0; 
    } 
    else 
    { 
     return n + sum(n - 1, c); /*self call to function sum() */ 
    } 
} 

int main(void) 
{ 
    printf("%u\n", sum(10, '.')); 
    printf("%u\n", sum(10, '*')); 

    return 0; 
} 

輸出是

...........55 
***********55 
+0

另一種使遞歸函數在第一次(或其他)遞歸上行爲不同的方法是傳遞一個名爲say'level'的參數,爲每次遞歸遞增,例如通過遞歸sum(n-1,level + 1) ;'。 (你也可以使用'level'來限制遞歸深度。)但是你最好調用一個第一級函數,然後調用遞歸函數。 – 2014-11-05 17:29:58

+0

@Weather Vane嚴格地說,這不是一個遞歸。它是一個調用遞歸函數的獨立函數。 – 2014-11-05 17:31:43

+0

對不起,@Vlad我以爲那是我寫的。 – 2014-11-05 17:38:51

0

局部變量位於堆棧所以在遞歸函數的每個調用創建一個新的,例如

void recursion(void) 
{ 
    int depth = 0; 
    if(depth < 10) { 
      depth++; 
      recursion(); 
    } 
} 

將導致一個無限循環,因爲每次遞歸調用創建堆棧上一個新depth0初始化。

你可以通過包裝實際的遞歸來解決這個問題。像這樣:

void recursion(void) 
{ 
    int depth = 0; 
    recursion_internal(&depth); 
} 

void recursion_internal(int *depth) 
{ 
    if(*depth < 10) { 
      (*depth)++; 
      recursion_internal(depth); 
    } 
} 

我希望有一點更一般的例子有幫助。

0

首先,我認爲你不明白遞歸實際上是如何工作的。無論我明白從我想說的是,如果你想temp+=2;被只讀一次,然後把它聲明如下#include"stdio.h"

<code> 
#include"stdio.h" 
int temp=0; 
temp+=2; 
</code> 

還要了解遞歸你可以訪問這個網站你的問題:http://pages.cs.wisc.edu/~vernon/cs367/notes/6.RECURSION.html

在這個網站它使用System.out.println("To print a text : ");,它與

printf("To print a text : "); in c。

希望這對你沒什麼幫助。

+0

嗯,我真的理解它,但我正在一個非常複雜的遞歸函數,但是這太長時間來發布它在這裏,所以我試圖做一個更簡單的例子。如果你想我可以發佈整個代碼.. – 2014-11-05 18:42:23

相關問題