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

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
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)

- Rejestracja:ponad 19 lat
- Ostatnio:2 miesiące
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)));
- Rejestracja:ponad 13 lat
- Ostatnio:około 8 lat
- Postów:1176
... 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])))



- Rejestracja:ponad 12 lat
- Ostatnio:około 10 lat

- Rejestracja:ponad 19 lat
- Ostatnio:2 miesiące
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;
}




- Rejestracja:ponad 12 lat
- Ostatnio:około 10 lat
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)

- Rejestracja:ponad 12 lat
- Ostatnio:około 10 lat
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
"źle działa"? To się nawet nie kompiluje...
Poprawiona wersja: http://ideone.com/t8ngwv

- Rejestracja:prawie 16 lat
- Ostatnio:4 miesiące
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).
- Rejestracja:ponad 12 lat
- Ostatnio:około 10 lat
#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 ?

- Rejestracja:ponad 19 lat
- Ostatnio:2 miesiące
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.
- Rejestracja:ponad 12 lat
- Ostatnio:około 10 lat
#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?
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