szukanie rekurencyjnie podanej liczby w tablicy

0

Napisz program, który szuka rekurencyjnie podanej liczby w tablicy zdeklarowanej jako zmienna globalna.
Miałby ktos może pomysl na te zadanie ? Mam to na zaliczenie

2

Chyba Kpisz:

#include <stdio.h>
#include <string.h>

char *chyba_kpisz = "Chyba Kpisz";

int chyba_kpisz_rekurencyjnie_prim(char c, int i) {
    if (-1 == i) return -1;
    char c_prim = chyba_kpisz[i];
    if (c == c_prim) return i;
    return chyba_kpisz_rekurencyjnie_prim(c, i-1);
}

// zwrócenie -1 oznacza że elementu nie znaleziono
int chyba_kpisz_rekurencyjnie(char c) {
    return chyba_kpisz_rekurencyjnie_prim(c, strlen(chyba_kpisz));
}

int main() {
    
    printf("Index of 'C': %d\n", chyba_kpisz_rekurencyjnie('C'));
    printf("Index of 'K': %d\n", chyba_kpisz_rekurencyjnie('K'));

    return 0;
}
0

C++17

#include <iostream>
#include <array>

bool is_exist( auto start_iter , auto end_iter , int number )
{
    if( start_iter == end_iter ) return false;
    return *start_iter == number ? true : is_exist( start_iter+1 , end_iter , number );
}

int main()
{
    std::array data {5,6,3,3,7,8,19,29};
    std::cout << is_exist(cbegin(data),cend(data),8) << std::endl;  
}

https://wandbox.org/permlink/XPX5mfSI7IUrDYvs

5
Immortall1232 napisał(a):

Napisz program, który szuka rekurencyjnie podanej liczby w tablicy zdeklarowanej jako zmienna globalna.

Zadanie typu: ucz się źle programować.
Rekurencja pasuje tu jak pięść do oka, a wymuszanie zmiennej globalnej to już dowód na to, że autor zadania ma blade pojęcie o programowaniu.

0

Teraz taka ciekawostka - dotycząca długość skompilowanego kodu do wybranej metody szukania elementów w tablicy.

  1. Rekurencja **91 **https://godbolt.org/z/58x3Pc
  2. Pętla range for **76 **https://godbolt.org/z/PbfWfr
  3. Algorytm std::find **53 **https://godbolt.org/z/hd9dqd
0

@KamilAdam: A to tak nie wystarczy? Po co druga funkcja? Pyta początkująca.

#include <stdio.h>
#include <string.h>

char *chyba_kpisz = "Chyba Kpisz";

int chyba_kpisz_rekurencyjnie(char c, int i) {
    if (-1 == i) return -1;
    char c_prim = chyba_kpisz[i];
    if (c == c_prim) return i;
    return chyba_kpisz_rekurencyjnie(c, i-1);
}

int main() {

    printf("Index of 'C': %d\n", chyba_kpisz_rekurencyjnie('C', strlen(chyba_kpisz)));
    printf("Index of 'K': %d\n", chyba_kpisz_rekurencyjnie('K', strlen(chyba_kpisz)));

    return 0;
}
0

Wersja powyższego kodu bez strlen:

#include <stdio.h>
#include <string.h>

const char *chyba_kpisz = "Chyba Kpisz";

int chyba_kpisz_rekurencyjnie(char c, int idx) {
	char *cptr = chyba_kpisz + idx;
	if (!*cptr) return -1;
	if (c == *cptr) return idx;
	return chyba_kpisz_rekurencyjnie(c, idx + 1);
}

int main() {

    printf("Index of 'C': %d\n", chyba_kpisz_rekurencyjnie('C', 0));
    printf("Index of 'K': %d\n", chyba_kpisz_rekurencyjnie('K', 0));
    printf("Index of 'X': %d\n", chyba_kpisz_rekurencyjnie('X', 0));

    return 0;
}

https://ideone.com/FJgu8u

Edit: pod Godbolt ta funkcja jest koszmarnie długa, ale rekurencja jest wyeliminowana (-O3).
https://godbolt.org/z/qrjYajcdv

0
Seventesprit napisał(a):

A to tak nie wystarczy? Po co druga funkcja? Pyta początkująca.

Zgaduje ze wynika to z faktu ze ktos wmowil programistom ze milion kilkulinijkowych funkcji jest lepsza niz kilka dluzszych funkcji. A ja to pozniej musze czytac i probowac zrozumiec. A nawet jesli nazwy funkcji sa 8-kilometrowe i piszacemu wydaje sie ze bardzo deskryptywne, to i tak z reguly nie wiadomo co funcja robi, wiec trzeba kazda z tych miliona funkcji przejzec skaczac w roznych miescach kodu, w roznych plikach, probujac zapamietac skad sie przyszlo w lancuchu np. dziesieciu 3-linijkowych funkcji, zamiast miec wszystko w jednym miejscu w 30 linijkach.
No ok, troche pomarudzilem, to teraz bardziej merytorycznie - w tym co napisalas masz zduplikowane strlen(chyba_kpisz) co jest dalekie od rozwiazania optymalnego. Zreszta gdyby zaczac od sygnatury tego co sie probuje napisac to raczej tego int i by tam nie bylo i naturalnie by sie pojawyly 2 funkcje (chociaz gbyby wywalic zmienne globalne, ktorych tam byc nie powinno, to juz trzeba by przekazac cos poza szukanym charem). Inna sprawa ze to strlen() kompletnie do niczego nie jest potrzebne i sluzy glownie do spowolnienia kodu (bez strlen() moglby byc inny wynik jesli sa duplikaty, no ale tresc z wymagan nawet nie mowi co ma byc zwrocone). Szczegolnie ze wielokrotnie liczone jest dokladnie to samo. No ale jesli sie stworzy odpowiedni duzy string zeby to bylo w praktyce mierzalne, to wymaganie rekurencji spowoduje ze program sie wysypie.

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