• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja szukająca rekurencyjne największego elementu w tablicy

Object Storage Arubacloud
+1 głos
145 wizyt
pytanie zadane 3 stycznia 2023 w C i C++ przez kotkrakers Nowicjusz (130 p.)

Mam problem z dwoma zadaniami.

  • Zadanie 1 polega na napisaniu funkcji, która w sposób rekurencyjny, znajdzie wartość największego elementu w tablicy. Mam coś takiego: 
int max(const int arr[], int size) {
    if (size == 1) {
        return arr[0];
    }
    int find = max(arr + 1, size - 1);
    return (arr[0] > find) ? arr[0] : find;
}

Jednak mój program się rozsypuje podczas testowania.


  • Zadanie 2 

Napisz funkcję, która w sposób rekurencyjny, będzie odwracać podaną liczbę. Odwrócenie liczby oznacza, utworzenie nowej liczby składającej się z tych samych cyfr, tylko w odwrotnej kolejności. Na przykład, dla liczby 12 liczba odwrócona będzie równa 21. W przypadku zer znajdujących się na końcu liczby zostają one pominięte w trakcie procesu odwracania, to znaczy, że liczba odwrócona dla liczby 100 to 1 (tak samo jak dla liczby 10).

Moja funkcja wygląda tak:

unsigned long reverse_number(unsigned long a) {
    if (a < 10) return a;
    return (a % 10) * pow(10, floor(log10(a))) + reverse_number(a / 10);
}

Problemem jest jednak to, że nie mogę korzystać z biblioteki math.h, więc funkcje pow, logarytm itd. odpadają. Jak mogę to zapisać inaczej, bez użycia biblioteki math.h?

2 odpowiedzi

0 głosów
odpowiedź 3 stycznia 2023 przez polandonion Mądrala (7,140 p.)
edycja 3 stycznia 2023 przez polandonion
zad 2. prostsza metoda

https://ideone.com/v5Yt1E
komentarz 4 stycznia 2023 przez mokrowski Mędrzec (156,140 p.)
Dla wygody, w 2 argumencie (int odwrocona), można dodać wartość domyślną 0. Będzie wygodniej używać wywołania w programie.

Funkcję można także przepisać na wyrażenie 3-argumentowe. Choć tu będą podzielone zdania co do czytelności...
komentarz 4 stycznia 2023 przez kotkrakers Nowicjusz (130 p.)
Dzięki, zobaczę co uda mi się zrobić :)
0 głosów
odpowiedź 3 stycznia 2023 przez Wiciorny Ekspert (271,610 p.)

Zadanie 2 dla przykładu: 
 

#include <iostream>

int reverse(int n)
{
    if (n == 0 || n % 10 == 0)
        return n;

    // Odwracamy pozostałe cyfry liczby n
    // poprzez rekurencyjne wywołanie funkcji dla n / 10
    int reversed = reverse(n / 10);

    // Mnożymy otrzymaną liczbę przez 10 i dodajemy ostatnią cyfrę
    // liczby n, co skutkuje odwróceniem kolejności cyfr
    return reversed * 10 + n % 10;
}

int main()
{
    std::cout << reverse(1234) << std::endl; // wyświetli 4321
    std::cout << reverse(100) << std::endl; // wyświetli 1
    std::cout << reverse(12340) << std::endl; // wyświetli 432
    std::cout << reverse(0) << std::endl; // wyświetli 0
    return 0;
}

co do zadania pierwszego bez dodatkowych bibliotek 
 

int findLargestElement(int* arr, int size)
{
    if (size == 1) return arr[0];
    int largest = findLargestElement(arr, size - 1);
    return (arr[size - 1] > largest) ? arr[size - 1] : largest;
}


 

komentarz 4 stycznia 2023 przez Oscar Nałogowiec (29,320 p.)
Tablice to lepiej będzie dzielic na dwie 'połowy'.
komentarz 4 stycznia 2023 przez mokrowski Mędrzec (156,140 p.)

@Wiciorny, 

#include <climits>

int findLargestElement(int * arr, std::size_t size, int mx = INT_MIN) {
	if (--size == 0) return mx;
	if (arr[size] > mx) {
		mx = arr[size];
	}
	return findLargestElement(arr, size, mx);
}
komentarz 4 stycznia 2023 przez kotkrakers Nowicjusz (130 p.)

Dzięki, pokombinuję :)

 

Podobne pytania

0 głosów
2 odpowiedzi 929 wizyt
pytanie zadane 10 grudnia 2018 w C# przez Zuber Nowicjusz (230 p.)
+1 głos
1 odpowiedź 150 wizyt
0 głosów
4 odpowiedzi 1,010 wizyt
pytanie zadane 28 października 2018 w JavaScript przez Mikołaj Użytkownik (780 p.)

92,661 zapytań

141,556 odpowiedzi

319,998 komentarzy

62,028 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...