Witam! Czy ktoś mógłby mi pomóc napisać program obliczający podwójną silnie?
Z czym masz problem? Pokaż jak to próbowałeś zrobić.
Jak robisz to rekurencyjnie, to tak samo jak zwykłą silnię, tylko odejmujesz 2 zamiast 1 w parametrze funkcji.
Miałem dopiero 2 lekce z pythona także jestem totalnie zielony. Mam problem ze sprowadzeniem zapisu n = n*(n-2)(n-4)... i tak dalej. Ale pewnie to jest źle.
Nie wiem z czego powinienem korzystać, gdyż miałem tylko pętle while, for no i range. Liczę na jakąś podpowiedź, która mnie samego naprowadzi na rozwiązanie.
Pozdrawiam!
Proszę o jakieś wskazówki z wykorzystaniem tego co podałem.
Tworzysz funkcję, powiedzmy def silnia(n)
. Poczytaj, czym jest rekurencja. Tutaj masz algorytm z wikipedii:
Pierwszą część algorytmu sprawdziwsz if
em, drugą robisz rekurencyjnie. To jest pierwszy sposób.
Jeśli nie chcesz robić tego rekurencją, to jest drugi - za pomocą pętli for przykładowo. Taki sam warunek jak na początku. Robisz pętle, mnożysz, zwracasz wynik. Dla podpowiedzi powiem, że range
może mieć 3 argumenty, z czego ten trzeci to krok pętli, czyli co ile przeskakuje licznik.
Najlepiej zrób obiema metodami, nauczysz się :)
A jak byś napisał normalną silnie? (Albo jak robiliście na ćwiczeniach)
Jeśli podasz jakiś kod by było prościej podpowiedzieć jak zmodyfikować.
silnia n = int(raw_input('podaj liczbę'))
wynik = 1
licznik = 1
while licznik != n:
wynik *= licznik
licznik +=1
print wynik
To jest ten kod z ćwiczeń, a raczej nie ten, bo chyba źle go przepisałem, był już na końcu... Albo tej silni nie umiem rozpisać, albo nie wiem co, inne rzeczy raczej mi wychodziły.
def double_factorial(n):
if n <= 1: return 1
else: return n * double_factorial(n - 2)
def double_factorial_tailrec(n):
def go(n, acc):
if n <= 1: return acc
else: return go(n - 2, n * acc)
return go(n, 1)
def double_factorial_iter(n):
result = 1
while n >= 2:
result *= n
n = n - 2
return result
print(double_factorial(8))
print(double_factorial_tailrec(8))
print(double_factorial_iter(8))
n = input('Podaj liczbę')
if n%2 == 0:
for b in range(2, n, 2):
n = n * b
print n
Dobra, to wymyśliłem dla liczb parzystych, wychodzi podwójna silnia. Jak ująć warunek dla liczb nieparzystych?
print'Program obliczający podwójną silnię:'
n = input('Podaj liczbę')
if n%2 == 0:
for b in range(2, n, 2):
n = n * b
print n
elif n%2 != 0:
for c in range(1, n, 2):
n = n * c
print n
Chyba mi wyszło :-)
Jeżeli jest ok, to poproszę o usunięcie wątku, pozdrawiam :-)
Nie jest ok, czym się różnią twoje dwie pętle? Kompletnie niczym :) Sprawdź jeszcze raz algorytm, który wkleiłem. Po co sprawdzasz, czy liczba jest parzysta, przecież od tego nic nie zależy? @n0name_l dał ci rozwiązanie, tyle, że z pętlą while.
Wizzie napisał(a):
Nie jest ok, czym się różnią twoje dwie pętle? Kompletnie niczym :) Sprawdź jeszcze raz algorytm, który wkleiłem. Po co sprawdzasz, czy liczba jest parzysta, przecież od tego nic nie zależy? @n0name_l dał ci rozwiązanie, tyle, że z pętlą while.
Dał mi rozwiązanie jakieś bardziej zaawansowane, a to chciałem zrobić tylko z tego co było. No ja tak potrafiłem rozpisać, po 2 ćwiczeniach z pythona expertem nie jestem :-) No to jak inaczej to prosto rozpisać, po 2 lekcjach z pythona? :(
Napisałem, po co ci sprawdzać czy liczba jest parzysta? Od tego nic nie zależy. Robisz for
a aż do dwójki i mnożysz, jak jest mniejsze od dwójki to wtedy silnia z tego jest równa 1.