簡體   English   中英

C - 數組中最小間隙的遞歸函數

[英]C - Recursive function for minimum gap in array

我正在嘗試優化一個函數,給定一個N int數組,返回一個元素和一個元素之間的最小差異。 顯然,該函數僅適用於維度> = 2的數組。 例如,給定數組{2,5,1},函數返回-4。 我試着寫我的代碼,但我認為它真的錯綜復雜

#include <stdio.h>
#define N 4
/*Function for the difference, works because in the main I already gives one difference*/
int minimodiff(int *a, int n, int diff) {
  if (n==1) {
    return diff;
  }
  if (diff>(*(a+1) - *a))
     return minimodiff(a+1, n-1, *(a+1)-*a);
  else return minimodiff(a+1, n-1, diff);
}

int main() {
  int a[N]= {1,8,4,3};
  printf("%d", minimodiff(a+1, N-1, *(a+1)-*a));
}

我想知道是否有辦法避免傳遞main中的第一個差異,但是在遞歸函數中執行所有操作。 我可以使用頭文件stdio.h / stdlib.h / string.h / math.h。 非常感謝您的幫助,我希望這可以讓我更好地理解遞歸函數。

minimodiff(a+1, N-1, *(a+1)-*a)是一種使用遞歸的弱方法,因為它使用N的遞歸深度,這很容易壓倒系統資源的深度限制。 在這種情況下,簡單的循環就足夠了。

一個好的遞歸方法會在每次調用時將問題減半,找到左半部分和右半部分的最小值。 它可能運行得不快,但最大遞歸深度為log2(N)

// n is the number of array elements 
int minimodiff2(const int *a, size_t n) {
  if (n == 2) {
    return a[1] - a[0]; 
  } else if (n <= 1) {
    return INT_MAX;
  }
  int left = minimodiff2(a, n/2 + 1);  // +1 to include a[n/2] in both halves
  int right = minimodiff2(a + n/2, n - n/2);
  return (left < right) ? left : right;
}

int main() {
  int a[]= {1,8,4,3};
  printf("%d", minimodiff2(a, sizeof a/ sizeof a[0]));
}

在進行最小計算,遞歸或其他方式時,如果將min設置為最高可能值,則會使初始條件更簡單。 如果你使用浮點數,它將是Infinity 由於您使用的是整數,因此來自limits.hINT_MAX被定義為可能的最大整數。 它保證大於或等於所有其他整數。

如果您使用循環迭代地執行此操作,則最初設置diff = INT_MAX 由於這是遞歸,因此INT_MAX是遞歸完成時返回的內容。

#include <limits.h>

static inline int min( const int a, const int b ) {
    return a < b ? a : b;
}

int minimodiff( const int *a, const size_t size ) {
    if( size <= 1 ) {
        return INT_MAX;
    }

    int diff = a[1] - a[0];
    return min( minimodiff(a+1, size-1), diff );
}

遞歸方法是一個壞主意,因為使用了額外的內存和函數調用。
無論如何,你的問題是避免第一個區別。
你可以使用中心。
由於參數diff是一個int變量,因此無法獲得大於INT_MAX的值。
因此,您可以通過將值INT_MAX作為與diff相對應的參數來完成對minimodiff的第一次調用。
此外,標准頭限制必須在頂部#include,以使INT_MAX宏可見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM