Menu
Coddy logo textTech

Funkcja rekurencyjna: silnia

Część sekcji Logika i przepływ sterowania ścieżki Dart w Coddy. Lekcja 49 z 65.

Silnia liczby to klasyczne działanie matematyczne, które doskonale nadaje się do zilustrowania rekurencji. Silnia dodatniej liczby całkowitej n (zapisywana jako n!) to iloczyn wszystkich dodatnich liczb całkowitych od 1 do n. Na przykład 5! = 5 × 4 × 3 × 2 × 1 = 120.

Silnia doskonale nadaje się do rekurencji, ponieważ w naturalny sposób rozkłada się na mniejsze, identyczne problemy. Aby obliczyć 5!, możesz potraktować to jako 5 × 4!. A 4! to po prostu 4 × 3! i tak dalej. Ten wzorzec powtarza się, aż dojdziesz do 1!, które jest równe 1.

int factorial(int n) {
  if (n <= 1) {
    return 1; // Przypadek bazowy
  }
  
  return n * factorial(n - 1); // Krok rekurencyjny
}

Przypadek bazowy zatrzymuje rekurencję, gdy n <= 1, zwracając 1. Krok rekurencyjny mnoży bieżącą liczbę przez silnię następnej mniejszej liczby. Gdy wywołasz factorial(5), zwraca 5 * factorial(4), które zwraca 5 * 4 * factorial(3) i tak dalej, aż osiągnie przypadek bazowy.

To podejście pokazuje, jak rekurencja elegancko rozwiązuje problemy, sprowadzając je do prostszych wersji tego samego problemu, dzięki czemu złożone obliczenia stają się naturalne i intuicyjne.

challenge icon

Wyzwanie

Łatwy

Utwórz program, który oblicza silnie dla wielu liczb za pomocą rekurencji. Twój program zademonstruje rekurencyjną funkcję silni, przetwarzając listę liczb i obliczając ich silnie.

  1. Odczytaj ciąg wejściowy zawierający liczby oddzielone przecinkami (np. "3,5,0,7")
  2. Podziel ciąg wejściowy na poszczególne liczby i skonwertuj każdą na liczbę całkowitą
  3. Utwórz rekurencyjną funkcję o nazwie factorial, która przyjmuje parametr będący liczbą całkowitą n
  4. Funkcja factorial powinna realizować następującą logikę:
    • Przypadek bazowy: Jeśli n jest mniejsze lub równe 1, zwróć 1
    • Krok rekurencyjny: Zwróć n pomnożone przez factorial(n - 1)
  5. Dla każdej liczby z listy wejściowej oblicz jej silnię za pomocą funkcji rekurencyjnej
  6. Wyświetl wyniki, podając każdą liczbę i odpowiadającą jej silnię
  7. Oblicz i wyświetl sumę wszystkich obliczonych silni

Na przykład, jeśli dane wejściowe to "4,3,2", program powinien wyświetlić:

Factorial Calculator
====================
Processing numbers: [4, 3, 2]
====================
Factorial Results:
4! = 24
3! = 6
2! = 2
====================
Sum of all factorials: 32
Calculation completed successfully

Jeśli dane wejściowe to "5,0,1", program powinien wyświetlić:

Factorial Calculator
====================
Processing numbers: [5, 0, 1]
====================
Factorial Results:
5! = 120
0! = 1
1! = 1
====================
Sum of all factorials: 122
Calculation completed successfully

Jeśli dane wejściowe to "6", program powinien wyświetlić:

Factorial Calculator
====================
Processing numbers: [6]
====================
Factorial Results:
6! = 720
====================
Sum of all factorials: 720
Calculation completed successfully

Twój program musi implementować rekurencyjną funkcję factorial, która wywołuje samą siebie z malejącymi wartościami, aż osiągnie przypadek bazowy. Funkcja powinna pokazywać, jak rekurencja rozkłada obliczanie silni na mniejsze, identyczne podproblemy. Użyj interpolacji ciągów, aby sformatować wyniki silni jako "$n! = $result". Pamiętaj, że 0! jest równe 1 z definicji matematycznej, co powinien prawidłowo obsłużyć przypadek bazowy.

Spróbuj swoich sił

import 'dart:io';

// TODO: Utwórz tutaj rekurencyjną funkcję obliczającą silnię

void main() {
  // Wczytaj ciąg wejściowy zawierający liczby oddzielone przecinkami
  String? input = stdin.readLineSync();
  
  // Podziel dane wejściowe i przekonwertuj je na liczby całkowite
  List<int> numbers = input!.split(',').map((str) => int.parse(str.trim())).toList();
  
  // TODO: Napisz poniżej kod, który:
  // 1. Przetworzy każdą liczbę za pomocą funkcji obliczającej silnię
  // 2. Obliczy sumę wszystkich silni
  // 3. Wyświetli wyniki w wymaganym formacie
  
  print("Factorial Calculator");
  print("====================");
  print("Processing numbers: $numbers");
  print("====================");
  print("Factorial Results:");
  
  // TODO: Oblicz i wyświetl tutaj wyniki obliczeń silni
  
  print("====================");
  // TODO: Wyświetl sumę wszystkich silni
  print("Calculation completed successfully");
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Dart online