Özyinelemeli minimum fonksiyon

#include
#define SIZE 7

int recursiveMinimum( int a[], int size );

int main(void) {
    int a[ SIZE ] = { 5, 7, 4, 3, 5, 1, 3 };//Number 2 is not initialized.

    printf( "The smallest number is %d", recursiveMinimum( a, SIZE ) );

    return 0;
}

int recursiveMinimum( int a[], int size ) {
    static int min ;
    static int i = 0;

    min = a[ i ];
    if( a[ i + 1 ] < min ) {
        min = a[ i + 1 ];
    }

    i++;

    if( i == size  ) {
        return min;
    } else {
       return recursiveMinimum( a, size  );
    }
}

Peki neden 2 yazdırıyor?

0
recursiveMinimum() 'da statik değişkenlerine gerek yoktur.
katma yazar chux, kaynak
recursiveMinimum() 'da statik değişkenlerine gerek yoktur.
katma yazar chux, kaynak
Tipik bir "yalnızca özyinelemeyi öğrenmek için yapay örnek" durumundan şüpheleniyorum. Bunun tek amacı öğretmen olduğunuz gündür, o zaman başkalarına yapay örneklerle özyinelemeyi nasıl kullanabileceğinizi öğretebilirsiniz, böylece öğretmen oldukları gün başkalarına özyinelemeyi yapay örneklerle nasıl kullanacaklarını öğretebilirler. ...
katma yazar Lundin, kaynak

12 cevap

Dizininize tek tek erişiminiz var: a [7] öğesine erişiyorsunuz ancak dizinizin son öğesi a [6] .

Bak bakalım:

i++;
if( i == size  ) {

ancak yukarıda a [i + 1] 'a erişiyorsunuz, bu, bir noktada a [size] ' a erişeceğiniz anlamına gelir (dizinin dışında).

Sorununuzu gidermek için if (i == size) değerini if (i == size - 1) olarak değiştirin.

2
katma
@ Shinz6 Görüyorum ki üç soru sormuştunuz ve hiçbir cevap kabul etmediniz. Size yardım ettiklerini düşündüğünüz soruyu cevapladığınız için teşekkür ederiz: meta.stackexchange.com/questions/5234/…
katma yazar ouah, kaynak
Açıklama için teşekkürler, bu düzeltti.
katma yazar Shinz6, kaynak

Dizininize tek tek erişiminiz var: a [7] öğesine erişiyorsunuz ancak dizinizin son öğesi a [6] .

Bak bakalım:

i++;
if( i == size  ) {

ancak yukarıda a [i + 1] 'a erişiyorsunuz, bu, bir noktada a [size] ' a erişeceğiniz anlamına gelir (dizinin dışında).

Sorununuzu gidermek için if (i == size) değerini if (i == size - 1) olarak değiştirin.

2
katma
@ Shinz6 Görüyorum ki üç soru sormuştunuz ve hiçbir cevap kabul etmediniz. Size yardım ettiklerini düşündüğünüz soruyu cevapladığınız için teşekkür ederiz: meta.stackexchange.com/questions/5234/…
katma yazar ouah, kaynak
Açıklama için teşekkürler, bu düzeltti.
katma yazar Shinz6, kaynak

INT_MIN kullanmak için, limitleri dahil etmeliyiz. Ayrıca güvenli olmamalıdır, çünkü imzasız, uzun, uzun, __int8 vs. kullanmak isteyebiliriz.

1
katma
Bu C olduğundan, farklı bir tip kullanmak için işlev parametreleri ve dönüş değerinin değiştirilmesi gerekir. Bu C ++ ve bir şablon işlevi ise, bir büyüklük == 0 ile başa çıkmak bir sorun olacaktır.
katma yazar rcgldr, kaynak

INT_MIN kullanmak için, limitleri dahil etmeliyiz. Ayrıca güvenli olmamalıdır, çünkü imzasız, uzun, uzun, __int8 vs. kullanmak isteyebiliriz.

1
katma
Bu C olduğundan, farklı bir tip kullanmak için işlev parametreleri ve dönüş değerinin değiştirilmesi gerekir. Bu C ++ ve bir şablon işlevi ise, bir büyüklük == 0 ile başa çıkmak bir sorun olacaktır.
katma yazar rcgldr, kaynak
  • min 'i doğru şekilde başlatmazsınız, örneğin sınırlar.h içinde bulunan INT_MIN sabiti gibi mümkün olan en küçük sayıya ayarlanması gerekir. Bunu yapmak yerine, her tekrarlamalı aramada min = a [i]; .
  • Sınırları aşan diziye erişirsiniz, i 6 olduğunda son işlev çağrısında tanımsız davranışı çağıran [i + 1] kodunu çalıştırırsınız. . Maalesef, programınız çökmedi, ancak bunun yerine bir miktar çöp değeri çıktı.
  • Yazdığınız bu algoritma için özyineleme kullanmak için kesinlikle hiçbir neden yoktur.
0
katma
Çok teşekkürler, özyinelemeyi sadece alıştırma için gerekli olduğu için kullandım.
katma yazar Shinz6, kaynak
  • min 'i doğru şekilde başlatmazsınız, örneğin sınırlar.h içinde bulunan INT_MIN sabiti gibi mümkün olan en küçük sayıya ayarlanması gerekir. Bunu yapmak yerine, her tekrarlamalı aramada min = a [i]; .
  • Sınırları aşan diziye erişirsiniz, i 6 olduğunda son işlev çağrısında tanımsız davranışı çağıran [i + 1] kodunu çalıştırırsınız. . Maalesef, programınız çökmedi, ancak bunun yerine bir miktar çöp değeri çıktı.
  • Yazdığınız bu algoritma için özyineleme kullanmak için kesinlikle hiçbir neden yoktur.
0
katma
Çok teşekkürler, özyinelemeyi sadece alıştırma için gerekli olduğu için kullandım.
katma yazar Shinz6, kaynak

Bence bu örnek özyinelemeli asgari bir fonksiyon için tasarlanan şeydi:

#include 
#define SIZE 7

#define min(a, b)  (((a) < (b)) ? (a) : (b))

/*      assumes size != 0 */
int recursiveMinimum(int a[], size_t size){
int *beg;               /* ptr to beginning */
int *mid;               /* ptr to middle */
int *end;               /* ptr to end */
    if(size < 2)        /* if size == 1 */
        return a[0];
    beg = &a[0];        /* else split array */
    mid = &a[size/2];   /*  and recurse */
    end = &a[size];
    return min(recursiveMinimum(beg, mid-beg),
               recursiveMinimum(mid, end-mid));
}

int main(void)
{
    int a[SIZE] = {5, 7, 4, 3, 5, 1, 3 };
    printf( "The smallest number is %d", recursiveMinimum( a, SIZE ) );
    return 0;
}
0
katma

Bence bu örnek özyinelemeli asgari bir fonksiyon için tasarlanan şeydi:

#include 
#define SIZE 7

#define min(a, b)  (((a) < (b)) ? (a) : (b))

/*      assumes size != 0 */
int recursiveMinimum(int a[], size_t size){
int *beg;               /* ptr to beginning */
int *mid;               /* ptr to middle */
int *end;               /* ptr to end */
    if(size < 2)        /* if size == 1 */
        return a[0];
    beg = &a[0];        /* else split array */
    mid = &a[size/2];   /*  and recurse */
    end = &a[size];
    return min(recursiveMinimum(beg, mid-beg),
               recursiveMinimum(mid, end-mid));
}

int main(void)
{
    int a[SIZE] = {5, 7, 4, 3, 5, 1, 3 };
    printf( "The smallest number is %d", recursiveMinimum( a, SIZE ) );
    return 0;
}
0
katma

Bu yöntemi deneyebilirsiniz:

double smaller(double a, double b){
  return (a

Algoritma analizi size bir O (n * log (n)) çalışma süresi vermelidir - buna rağmen bir tutam tuz alın.

0
katma

Bu yöntemi deneyebilirsiniz:

double smaller(double a, double b){
  return (a

Algoritma analizi size bir O (n * log (n)) çalışma süresi vermelidir - buna rağmen bir tutam tuz alın.

0
katma

Bu kodu göster (ilk işlev çağrısında [0] olarak başlatma min.

#include
#define SIZE 7

int recursiveMinimum( int a[], int size );

int main(void) {
    int a[ SIZE ] = { 5, 7, 4, 3, 5, 1, 3 };//Number 2 is not initialized.

    printf( "The smallest number is %d", recursiveMinimum( a, SIZE ) );

    return 0;
}

int recursiveMinimum( int a[], int size ) {
    static int min;
    static int initialize_min = 1;
    static int i = 0;


    if(initialize_min )
    {
        min = a[0];
        initialize_min = 0;
    }



    if( a[ i ] < min ) {
        min = a[ i ];
    }

    i++;

    if( i == size  ) {
        return min;
    } else {
       return recursiveMinimum( a, size  );
    }
}
0
katma

Bu kodu göster (ilk işlev çağrısında [0] olarak başlatma min.

#include
#define SIZE 7

int recursiveMinimum( int a[], int size );

int main(void) {
    int a[ SIZE ] = { 5, 7, 4, 3, 5, 1, 3 };//Number 2 is not initialized.

    printf( "The smallest number is %d", recursiveMinimum( a, SIZE ) );

    return 0;
}

int recursiveMinimum( int a[], int size ) {
    static int min;
    static int initialize_min = 1;
    static int i = 0;


    if(initialize_min )
    {
        min = a[0];
        initialize_min = 0;
    }



    if( a[ i ] < min ) {
        min = a[ i ];
    }

    i++;

    if( i == size  ) {
        return min;
    } else {
       return recursiveMinimum( a, size  );
    }
}
0
katma