Rekurencja i ilość cyfr w liczbie.

Rekurencja i ilość cyfr w liczbie.
P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
0

Cześć,
czy ktoś pokazałaby mi w jaki sposób w C# rekurencyjnie rozwiązać to zadanie:
Stwórz funkcję int IleWiecej2Niz5(ulong liczba) obliczającą, których cyfr w liczbie jest więcej: 2 czy 5? Funkcja pobiera jako parametr liczbę. Np. jeśli jest 3 dwójki i 1 piątka, funkcja zwraca 2. Jeśli mamy 3 dwójki i 5 piątek, funkcja zwróci -2. ?

M9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
1

Ostatnią liczbę cyfry możesz wyznaczyć przez resztę z dzielenia przez 10 czyli masz 15 % 10 = 5
Sprawdzasz czy ostatnia cyfra to 2 i jeśli to ona to to zwracasz 1 w przeciwnym wypadku zwracasz -1
Usunąć ostatnią cyfrę z liczby możesz poprzez zamianę jej na string i metodą Substring usunąć ostatnią cyfrę i później znowu na liczbę (być może jest jakiś lepszy sposób na to), przekazujesz tę liczbę ponownie do metody

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5027
2

Dostajesz się do cyfry prez modulo 10:

Kopiuj
using System;

class MainClass {
  static int moreHelper(ulong num, int numTwo, int numFive) {
    if (num == 0) {
      if (numTwo > numFive) return 1;
      else if (numTwo < numFive) return -1;
      else return 0;
    }
    else {
      if (num % 10 == 2) ++numTwo;
      if (num % 10 == 5) ++numFive;
      num /= 10;
      return moreHelper(num, numTwo, numFive);
    }
  }
  static int more2Than5digits(ulong num) {
      return moreHelper(num, 0, 0);
  }
  public static void Main (string[] args) {
    Console.WriteLine (more2Than5digits(252787878));
  }
}
FA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: warszawa
  • Postów: 315
2

Ostatnią liczbę cyfry możesz wyznaczyć przez resztę z dzielenia przez 10 czyli masz 15 % 10 = 5
Sprawdzasz czy ostatnia cyfra to 2 i jeśli to ona to to zwracasz 1 w przeciwnym wypadku zwracasz -1
Usunąć ostatnią cyfrę z liczby możesz poprzez zamianę jej na string i metodą Substring usunąć ostatnią cyfrę i później znowu na liczbę (być może jest jakiś lepszy sposób na to), przekazujesz tę liczbę ponownie do metody

Do dobry pomysł. Ostania liczbę można usuwać po prostu dzieląc przez 10. To bardziej spójne niż zamiana na string, Bo jak już raz zamienisz na string to możesz iterować po nim jak po tablicy.

Co do rekurencji, będziesz musiał jeszcze przekazywać jakoś parametry dla funkcji, można zrobić to na 3,5 sposobu.

Pierwszy to zrobić sobie zmienna w wyższym skopie która będzie wspólna dla każdego wywołania np w klasie, lub jakiegoś statika. Bedzie śmigać, ale ma to taką wadę że funkcja może być wołana naraz tylko jedne raz, innaczej będą bugi. zaletą jest to że różne ścieżki rekurencji, moga się łatwo komunikować.

Kopiuj
int counter; long ;
public int IleWiecej2Niz5(ulong liczba)
{
//logika
IleWiecej2Niz5(liczba/10);
}

Lepszym rozwiązaniem jest przekazywanie tych zmiennych jako parametry, bo funcja zadziała zawsze prawidłowo.

Kopiuj
int counter; long ;
public int IleWiecej2Niz5(ulong liczba)
{
return IleWiecej2Niz5(0,liczba);
}
private int IleWiecej2Niz5(int counter,ulong liczba)
{
//logika
return IleWiecej2Niz5(counter, liczba/10)
}

Trzecią opcją jest trzymanie zmiennych pomocnych, w wyższym ale lokalnym scop'ie. Coś pomiędzy pierwszym a drugim rozwiązaniem, możesz to zrobic przekazując parametry jako klase, zaminić funkcje w klase, lub kożystając z clousure.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.