Rekurencja i ilość cyfr w liczbie.

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. ?

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

2

Dostajesz się do cyfry prez modulo 10:

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));
  }
}
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ć.

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.

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.

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