[英]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.h的INT_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.