2017-01-30 16 views
1

2つの配列が同じ要素を持つかどうかを調べる関数を書く。私はこれを確認するための再帰的な関数を作成する必要があります。それのためのいくつかのアイデアはありますか?例えば ここアレイAB出力:2つの配列に同じ要素があるかどうかを調べる再帰的方法

A:[2 4 5 4]

B:[4 2 4]

アウトプットがあれば1であるべきである1

を出します同じであり、そうでなければ0である。

ここに私の定期的な機能:私はあなたがこのために探していると思う

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 
#include <assert.h> 
int partition(int *a, int left, int right) 
{ 

    int first = left; 
    int pivot; 
    int pos; 
    srand((unsigned)time(NULL)); 
    pos = rand() % (right - left + 1) + left; 
    swap(a + first, a + pos); 
    pivot = a[first]; 

    while (left<right) 
    { 
     while (a[right] > pivot) right--; 
     while ((left < right) && (a[left] <= pivot)) left++; 
     if (left < right) 
      swap(a + left, a + right); 
    } 
    pos = right; 
    a[first] = a[pos]; 
    a[pos] = pivot; 
    return pos; 
} 
void quick_sort(int *a, int first, int last) 
{ 
    int pos; 
    if (first<last) 
    { 
     pos = partition(a, first, last); 
     quick_sort(a, first, pos - 1); 
     quick_sort(a, pos + 1, last); 
    } 
} 
int *input_array_dyn(int n) 
{ 
    int i; 
    int *a; 
    a = (int *)calloc(n, sizeof(int)); 
    assert(a); 
    printf("enter the array of length %d\n", n); 
    for (i = 0;i<n;i++) 
     scanf_s("%d", a + i); 
    return a; 
} 
int part1_excute(int *a, int *b, int n) 
{ 
    int index; 
    int ans = 1; 
    quick_sort(a, 0, n - 1); 
    quick_sort(b, 0, n - 1); 
    for (index = 0;index<n;index++) 
    { 
     if (a[index] != b[index]) 
      ans = 0; 
    } 
    if (ans == 0) return 0; 
    else return 1; 
    free(a); 
    free(b); 
} 

void main() 
{ 
    int *a, *b; 
    int ans = 1; 
    int size; 
    printf("Please input the size of array\n"); 
    scanf_s("%d", &size); 
    printf("First array:\n"); 
    a = input_array_dyn(size); 
    printf("Second array:\n"); 
    b = input_array_dyn(size); 
    printf("If the output is 1, the arrays are the same.\n"); 
    printf("If the output is 0, the arrays are the not same.\n"); 
    printf(" The ans is: %d\n", part1_excute(a,b,size)); 

}

+1

再帰的な理由は? BTWクイックソートは既に再帰的です。 –

+2

なぜソートを再実装するのですか?あなたが達成しようとしていることが単純な比較であるなら、 'qsort()'を使ってください。 – unwind

+1

'無料(a); free(b); '決してこの点に達しない。 – BLUEPIXY

答えて

1

: -

/* created to help alex :)*/ 
#include<stdio.h> 

int x[] = {'a', 'b', 'c', 'd'}; 
int y[] = {'d', 'a', 'c', 'b'}; 

/* core logic, which will iterate recursively. 
    to more accurately understand this logic, you should use 
    x[] = {'a', 'b', 'c', 'd'}; 
    y[] = {'e', 'f', 'g', 'h'}; 

    for your question replace x and y with 
    x[] = {2, 4, 5, 4}; 
    y[] = {4, 5, 2, 4}; 

    i am apologizing if names of variables or functions are inappropriate. 
    If program is not compiling there should be some syntax errors but logic is tested OK 
*/ 
int compare(int *x, int lx, int *y, int ly, int called){ 
    int len = 0; 
    if(ly == 0 || lx == 0) 
     return 0; 
    printf("comparing %c %c\n",*x,*y); 
    if(*x == *y) 
     len += 1; 
    if(called) 
     len += compare(x+1,lx-1,y,ly,called-1); 
    len += compare(x,lx,y+1,ly-1,0); 
    return len; 
} 

/* returns true or false after calling the core logic */ 
int wraper_compare(int *x, int lx, int *y, int ly){ 
    int len; 
    if (ly > lx){ 
     len = compare(x,lx,y,ly,lx); 
     if (len == lx) 
      return 1; 
     else 
      return 0; 
    } else { 
     len = compare(x,lx,y,ly,ly); 
     if(len == ly) 
      return 1; 
     else 
      return 0; 
    } 
} 

int main(){ 
    printf("%d \n",wraper_compare(x,4,y,4)); 
    return 0; 
} 

私は 'A'、 'B' を持つ配列を使用しました、 'c'、 'd'のように再帰的ロジックを調べることができます。 Mがxのサイズで、Nがyのサイズである場合、これはMxNの反復を使用します。

これは次の場合に機能します。 - 1.通常の場合(同じ配列の長さで、1つの配列に要素の重複がない) 2.複数の要素を複製する。 3.異なる長さ。 (この場合、小さい方が小さい場合は1が返されます)

私にそのような機会を与えることをありがとうございます。この種のものを長い間(少なくとも1年)探していた。このような質問をいただきありがとうございました美しい質問。 +1(既に与えられている)

私はテストに合格したと思います。私に結果を教えてください:) :)

関連する問題