2015-11-05 80 views
0

我已经做了下面的功能,将删除相邻的副本。如何使用递归实现它?如何使用递归删除数组中的邻居重复?

例如1,1,5,4,7,7,9,9,8将导致以1, 5, 4, 7, 9, 8

void remove() { 
    int arr[9]={1,1,5,4,7,7,9,9,8}; 
    int newarr[9]; 
    int counter=0; 

    for(int i = 0; i < 9; i++) { 
    if(arr[i] == arr[i + 1]) { 
     newarr[counter] = arr[i]; 
     i += 1; 
     counter++; 
    } else { 
     newarr[counter] = arr[i]; 
     counter++; 
    } 
    } 

    for(int z = 0; z < counter; z++){ 
    printf("%d ", newarr[z]); 
    } 
} 
+5

提示:开始使​​用铅笔和纸的小例子。在了解递归如何工作之后,尝试实现它。如果你失败了,我们来帮忙! – Maroun

回答

2

首先你的程序是未定义行为,因为它试图访问存储阵列超出循环的时候i等于8

for(int i = 0; i < 9; i++) { 
    if(arr[i] == arr[i + 1]) { 
        ^^^^^^ 

与索引等于9arr[8 + 1])的元件不存在。

此外,逻辑错误。您正在递增i当两次ARR [i]是等于arr[i+1]

for(int i = 0; i < 9; i++) { 
         ^^^^ 
    if(arr[i] == arr[i + 1]) { 
     newarr[counter] = arr[i]; 
     i += 1; 
     ^^^^^^ 
     counter++; 
    } else { 

但索引也arr[i+2]下一个元素可以等于arr[i]。因此,相同的值将在目标数组中至少写入两次。

尝试例如你的程序应用到阵列这样

int arr[] = { 1, 1, 1, 1, 1, 1 }; 

所以,你需要完全重新编写程序。:)

至于递归函数然后可以看看下面的方法

#include <stdio.h> 

int * unique(const int *a, size_t n, int *b) 
{ 
    if (n == 0) return b; 

    if (n == 1 || a[0] != a[1]) *b++ = *a;   

    return unique(a + 1, n - 1, b); 
} 

int main(void) 
{ 
    int a[] = { 1, 1, 5, 4, 7, 7, 9, 9, 8 }; 
    const size_t N = sizeof(a)/sizeof(*a); 

    for (size_t i = 0; i < N; i++) printf("%d ", a[i]); 
    printf("\n"); 

    int b[N]; 

    int *last = unique(a, N, b); 

    for (int *first = b; first != last; ++first) printf("%d ", *first); 
    printf("\n"); 
} 

它的输出是

1 1 5 4 7 7 9 9 8 
1 5 4 7 9 8 

如果编译器不支持C99标准,则程序可以像

#include <stdio.h> 

int * unique(const int *a, size_t n, int *b) 
{ 
    if (n == 0) return b; 

    if (n == 1 || a[0] != a[1]) *b++ = *a;   

    return unique(a + 1, n - 1, b); 
} 

#define N 9 

int main(void) 
{ 
    int a[N] = { 1, 1, 5, 4, 7, 7, 9, 9, 8 }; 
    int b[N]; 
    size_t i; 
    int *first, *last; 

    for (i = 0; i < N; i++) printf("%d ", a[i]); 
    printf("\n"); 

    last = unique(a, N, b); 

    for (first = b; first != last; ++first) printf("%d ", *first); 
    printf("\n"); 
} 
+0

出现错误:'typedef'size_t''使用不当' – beginner

+0

@quickbrownfox显示错误发布的语句。 –

+0

on line 17'不正确地使用typedef'size_t'' 在17行'表示失踪;' – beginner