2015-06-12 87 views
0

我想寫一個遞歸函數來查找整數數組中的重複項。例如,如果數組是:{4,1,4,3,2,3},它應該返回2. 我嘗試了類似mergesort的方法,但沒有成功。有人可以幫忙嗎?遞歸的方式來查找C中的重複項在C

我嘗試(與有序陣列只適用):

int count(int arr[], int bot, int top){ 
    if(bot==top) return 0; 
    else{ 
    int med = (bot+top)/2; 
    int n = count(arr, bot, med) + count(arr, med+1, top); 
    if(arr[med]==arr[med+1]) n++; 
    return n; 
    } 
} 
+0

歡迎使用堆棧溢出,請考慮使用[SSCCE](http://stackoverflow.com/help/mcve)發佈關於特定程序問題的問題。謝謝。 – zmo

+0

@餘浩我沒有放,因爲我認爲不會改進。我認爲它需要一個不同的算法。無論如何,我剛剛更新了這篇文章。 – Brontolo

+0

預期結果究竟是什麼?每個條目的出現次數的最大值? – Codor

回答

1

你只是檢查是否arr[med]==arr[med+1]當你有一個像111的情況下,這將有問題,則計數將成爲兩個,而是計數實際上應該是一個。因此添加一個額外的標誌來檢查是否重複了相同的元素。

對數組進行排序。也許你可以使用合併排序或其他方式來做到這一點,然後像這樣的東西應該工作!

#include <stdio.h> 

int main(void) { 
    // your code goes here 
    int a[16] = {1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,5}; 
    int out = count(a,0,15); 
    printf("%d\n",out); 
    return 0; 
} 

int count(int arr[], int bot, int top){ 
    int flag = 0; 
    if(bot==top) return 0; 

    else{ 
    int med = (bot+top)/2; 
    int n = count(arr, bot, med) + count(arr, med+1, top); 
    if(arr[med]==arr[med+1]) 
    { 
     flag = arr[med-1]; 
     if(flag != arr[med]) 
      n++; 
    } 
    return n; 

    } 
} 
+0

我的目標是要做到這一點**沒有**首先排序: – Brontolo

+0

@Brontolo爲什麼不呢?你擔心表現嗎?這是作業嗎?沒有一定的背景下很難提供幫助。 – jacwah

+0

@jacwah對不起jacwah ,你說得對,是的,這是我在編程課程中發現的一個練習,所以我認爲目標就是做所要求的東西! – Brontolo