2015-09-26 36 views
1

我在嘗試使用遞歸執行反向數組時遇到了一些問題。下面是函數原型:在C編程中遞歸的反向數組

void rReverseAr(int ar[ ], int size); 

這裏是我的代碼:

int main() 
{ 
    int ar[10], size, i; 

    printf("Enter array size: "); 
    scanf("%d", &size); 
    printf("Enter %d numbers: ", size); 
    for (i = 0; i<size; i++) 
     scanf("%d", &ar[i]); 
    rReverseAr(ar, size); 
    printf("rReverseAr(): "); 
    for (i = 0; i<size; i++) 
     printf("%d ", ar[i]); 
    return 0; 
} 

void rReverseAr(int ar[], int size) { 
    int start = 0, end = size - 1, temp; 
    if (start < end) { 
     temp = ar[start]; 
     ar[start] = ar[end]; 
     ar[end] = temp; 
     start++; 
     end--; 

     rReverseAr(ar, size - 1); 
    }  
} 

預期結果應該是,當用戶輸入1 2 3,它應該返回3 2 1。但是,通過這些代碼,我得到的輸出是2 3 1

任何想法?

回答

3

你的代碼幾乎是正確的。唯一的問題是,不是從兩側「縮小」陣列,而是從後面縮小它。

的遞歸調用應該是這樣的:

rReverseAr(ar + 1, size - 2); 

你並不需要增加start或遞減end,因爲它們的值不會修改後使用。

+0

好吧,非常感謝!有用!但是,我是否可以知道爲什麼每次遞歸都會增加數組元素的位置,並且同時您將數組大小減少2?我的意思是像+1和-2如何限制陣列從後面收縮? – hyperfkcb

+1

@Denise每次遞歸調用都會將「子數組」傳遞到下一級。該子數組在初始元素之後(即,在指針算術語法中的'ar + 1'處,或者在數組索引語法中'&ar [1]')開始一個元素。子數組的大小比原始數組的大小小2,因爲初始和最後一個元素已經被處理。 – dasblinkenlight

+0

我明白了。非常感謝您的幫助! – hyperfkcb

0

一個簡單的方法:

#include<stdio.h> 
using namespace std; 

void revs(int i, int n, int arr[]) 
{ 
    if(i==n) 
    { 
    return ; 
    } 
    else 
    { 
    revs(i+1, n, arr); 
    printf("%d ", arr[i]); 
    } 
} 


int main() 
{ 
    int i, n, arr[10]; 
    scanf("%d", &n); 
    for(i=0; i<n; i++) 
    { 
     scanf("%d", &arr[i]); 
    } 
    revs(0, n, arr); 

    return 0; 
} 

迭代數組與遞歸在C:link