2011-12-24 48 views
0

我需要編寫一個函數,輸入數組大小並分配內存,並讀取(scanf)值到這個數組。帶循環遞歸函數的輸入數組(.c)

我寫了這個功能,但它不工作:

void getss(int array[], int size) 
{ 

    int counter = 0; 
    if (size == 0) 
     return; 
    if (counter < size) { 
     scanf("%d", &array[i]); 
     counter++; 
    } 
    getss(array, size - 1); 
} 
+1

這不起作用?它在哪裏失敗? – sarnold 2011-12-24 08:47:31

+0

其他人的背景信息:http://stackoverflow.com/q/8623471/377270 - 是的,這幾乎是重複的,但是問題應該從開始的位置「遷移」多遠?到目前爲止我看起來很好...... – sarnold 2011-12-24 08:48:19

+2

它不起作用,因爲'我'是未申報的。應該改爲'size'。但即使如此,'array [0]'永遠不會被寫入。 – Jens 2011-12-24 08:52:04

回答

1

這是不完全清楚你想達到的目標。但我猜測你的數組參數在遞歸調用中不正確。現在所有調用getss的都是相同的數組,但大小不同。 (變量我從哪裏來?變量計數器在發佈的代碼中沒有太多用處。)

我假設你需要更新數組指針,以指向遞歸調用中數組中的下一個元素。換句話說,傳遞數組中第二個元素的地址而不是第一個元素(當前行爲)。這將符合遞歸調用中的大小1。

實現是微不足道的,但作爲練習留給海報,因爲這看起來像我的作業。

0

隨着其他問題,使用counter有什麼意義?它是0或1,並且永遠不會傳遞給下一個呼叫。它是否應該被聲明爲靜態的?

1

你有不需要的變量。這是你正在努力實現的:

以下將填寫數組,以便用scanf()讀取的第一個值將存儲在最後一個元素中。

void getss(int array[], int size) 
{ 
    if (size == 0) 
     return; 
    scanf("%d", &array[size-1]); 
    getss(array, size - 1); 
    return; 
} 

以下內容將填入數組,以便用scanf()讀取的第一個值將存儲在第一個元素中。

void getss(int array[], int size) 
{ 
    if (size == 0) 
     return; 
    scanf("%d", &array[0]); 
    getss(&array[1], size - 1); 
    return; 
} 
0
#include <stdio.h> 
#include <stdlib.h> 

void getss(int* array, int size){ 
    if (size == 0) 
     return; 
    scanf("%d", array); 
    getss(++array, size - 1); 
} 

int main(){ 
    int *array; 
    int i, size; 

    printf("input array size:"); 
    scanf("%d", &size); 
    array = (int*)malloc(sizeof(int)*size); 
    getss(array, size); 
    for(i=0;i<size;i++){ 
     printf("array[%d]=%d\n", i, array[i]); 
    } 
    return 0; 
} 
1

如果你要反覆這樣做,你會怎麼做呢?我假設是這樣的:

void getss(int array[], int size) { 
    int i; 
    for (i = 0; i < size; i++) { 
    scanf("%d", array[i]); 
    } 
} 

我們i那裏只是用來通過數組來算我們的方式,所以如果我們改變我們的功能略有我們可以擺脫它:

void getss(int* array, int size) { 
    for (; size > 0; size--, array++) { 
    scanf("%d", array); 
    } 
} 

現在我們的「counter」是size變量本身,而不是在我們的數組中索引,我們只是繼續前進我們的指針。

現在,這是一個完美的形式被轉化爲遞歸函數。

void getss(int* array, int size) { 
    if (size > 0) { 
    scanf("%d", array); 
    getss(array + 1, size - 1); 
    } 
} 

所以,我們的循環的終止條件已經進入一個if和代替array++size--我們array+1傳:與其size--array++我們可以在函數結束時通過新的值到另一個調用getsssize-1到我們的下一個電話。它實現了與循環相同的結果,但沒有顯式的循環結構。