• 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

+1 głos
581 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 Dyskutant (7,710 p.)
edycja 3 stycznia 2023 przez polandonion
zad 2. prostsza metoda

https://ideone.com/v5Yt1E
komentarz 4 stycznia 2023 przez mokrowski Mędrzec (159,000 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 (283,500 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,420 p.)
Tablice to lepiej będzie dzielic na dwie 'połowy'.
komentarz 4 stycznia 2023 przez mokrowski Mędrzec (159,000 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 1,364 wizyt
pytanie zadane 10 grudnia 2018 w C# przez Zuber Nowicjusz (230 p.)
+1 głos
1 odpowiedź 261 wizyt
0 głosów
4 odpowiedzi 1,672 wizyt
pytanie zadane 28 października 2018 w JavaScript przez Mikołaj Użytkownik (780 p.)

93,778 zapytań

142,737 odpowiedzi

323,388 komentarzy

63,382 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...