Funkcja rekurencyjna [C]

0

Witam , chciałbym prosić o pomoc w napisaniu funkcji rekurencyjnej która zwróci wartość maksymalną z n-elementowej tablicy (w jezyku C)

0

Dziel tablice na pół i szukaj maksa w obu połówkach (tą samą funkcją) a potem porównaj maksy z jednej i z drugiej połówki i zwróć tą większą wartość (warunek stopu rekurencji to oczywiście tablica 1 elementowa)

1
int recmax(int *begin,int *end)
  {
   int a,b,*mid;
   a=end-begin;
   if(a>1)
      {
       mid=begin+(a>>1);
       a=recmax(begin,mid);
       b=recmax(mid,end);
       return a>b?a:b;
      }
   return *begin;
  }

druga wersja z użyciem max()

int recmax(int *begin,int *end)
  {
   int *mid=begin+((end-begin)>>1);
   return mid>begin?max(recmax(begin,mid),recmax(mid,end)):*begin;
  }

wywołanie:

int tb[]={1,8,9,7,5,4,3,2};
printf("%d",recmax(tb,tb+sizeof(tb)/sizeof(*tb)));
0

... albo po prostu uzyj rekurancji jako iteracji, o cos w ten desen:

func max_in_arr(tab, size, pos)
  if(pos >= size) reurn -Inf;
  else return max(tab[pos], max_in_arr(tab, size, pos+1))

Na prosbe @_13th_Dragon wersja z rekursja ogonowa:

func max_in_arr(tab, size, pos, curr_max)
  if(pos >= size) reurn curr_max;
  else return max_in_arr(tab, size, pos+1, max(curr_max, tab[pos])))
0

potrafiłby zrobić to ktoś nie uzywając "begin"?

@Edit
ahh moj blad nie zauwazylem ze begin jest typu int i myslalem ze to jakas "funkcja"

1
int max(int a,int b) { return a>b?a:b; }
int recmax(int A[],int B[])
  {
   int *M=A+((B-A)>>1);
   return M>A?max(recmax(A,M),recmax(M,B)):A[0];
  } 
int main()
  {
   int tb[]={1,8,9,7,5,4,3,2};
   printf("%d",recmax(tb,tb+sizeof(tb)/sizeof(*tb)));
   return 0;
  }

lub:

int *max(int a[],int b[]) { return a[0]>b[0]?a:b; }
int *recmax(int A[],int B[])
  {
   int *M=A+((B-A)>>1);
   return M>A?max(recmax(A,M),recmax(M,B)):A;
  }
int main()
  {
   int tb[]={1,8,9,7,5,4,3,2};
   printf("%d",*recmax(tb,tb+sizeof(tb)/sizeof(*tb)));
   return 0;
  }
0

Miałbym prośbę , aby ktoś napisał tą funkcje tylko operatorami które wystepują w tej funkcji którą podam na dole , ze wzgledu na to że tylko je poznałem i tylko tych wolno mi uzywać ,byłbym wdzieczny:

jest to funkcja rekurencyjna odwracajaca tablice
void list(int n, int t[]){
if(n>0){
list (n-1,t);
printf ("%d",t[n-1])
}
}
int main (void){
const int n=5
int a[n]={7,-6,0,4};
list(n,a)

0

a mógłby sprawdzić ktoś czemu ta funkcja źle działa??

#include <stdio.h>
#include<conio.h>


int najwieksza(int n ,int t[]){ 
	if(n==1)return t[0];
	
	else{
	
	
	if (t[n-1]>t[n]) return najwieksza(n-1,t);
	else{
	 t[n-1]=t[n] ;
	  return najwieksza (n,t);
}

}
}
	int main(void){
		int const n=3;
		int a[n]={9,8,7};
		int w=najwieksza(n,a);
		printf ("%d",w);
		getche ();
		return 0;
		
	}

używaj tagów <code> - msm

0

"źle działa"? To się nawet nie kompiluje...
Poprawiona wersja: http://ideone.com/t8ngwv

0

Uzywam dev c++ u mnie Twoja wersja zwraca nieprawidłowa wartość 322..

nawet w Tym kompilatorze online wychodzą złe wyniki !!!

0

Kompilator ci już powiedział co jest nie tak.

0

mógłby ktoś dobrze poprawić?

0

10 zł

2

Masz:

                int const n=3;
                int a[n]={9,8,7};
                int w=najwieksza(n,a);

Oraz:

        if (t[n-1]>t[n]) return najwieksza(n-1,t);
        else{
         t[n-1]=t[n] ;
          return najwieksza (n,t);

T[n] to odwołanie się poza zakres tablicy...

Btw. formatowanie kodu (i nie używaj Dev-cpp).

0
 #include <stdio.h>
#include<conio.h>
 
 
int najwieksza(int n ,int t[]){ 
        if(n==1)return t[0];
 
        else{
 
 
        if (t[n-1]>t[n]) return najwieksza(n-1,t);
        else{
         t[n-1]=t[n] ;
          return najwieksza (n,t);
}
 
}
}
        int main(void){
                int const n=4;
                int a[n]={1,4,2,7};
                int w=najwieksza(n,a);
                printf ("%d",w);
                getche ();
                return 0;
 
        }
 

cały kod co jest jeszcze nie tak ?

0

cały kod co jest jeszcze nie tak ?

Przecież ciągle wychodzisz poza zakres tablicy.

0

Nadal, to co było to zostało, niczego nie zmieniłeś.
@msm - dla tego pytającego nie wystarczy wskazać błąd, on akceptuje wyłącznie gotowce.

0
#include <stdio.h>
#include<conio.h>


int najwieksza(int n ,int t[]){ 
	if(n==1)return t[0];
	
	else{
	
	
	if (t[n-1]>t[n]) return najwieksza(n-1,t);
	else{
	 t[n-1]=t[n] ;
	  return najwieksza (n-1,t);
}

}
}
	int main(void){
		int const n=4;
		int a[n]={1,4,2,7};
		int w=najwieksza(n,a);
		printf ("%d",w);
		getche ();
		return 0;
		
	}
 

teraz mam zwracany pierwszy element ,nadal ten sam błąd?

1

teraz mam zwracany pierwszy element ,nadal ten sam błąd?

D-O-K-Ł-A-D-N-I-E P-R-Z-E-C-Z-Y-T-A-J P-O-S-T: http://4programmers.net/Forum/C_i_C++/209708-funkcja_rekurencyjna_c?p=914595#id914595

0

głupi Ja ,dopiero teraz zauwazyłem , dziekuje :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1