faktöriyel hesaplama

Başlatan neneki, 06 Aralık 2010 - 02:08:04

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

neneki

Arkadaşlar python çalışalı bir iki gün oldu; döngüleri kullanarak birşeyler yapim dedim. Sadece while döngüsünü kullanarak şu ufacıcık programı yaptım huzurlarınızda :)
#!/usr/local/bin/python
# _*_ coding: utf-8 _*_

x=int(input('Bir sayı girin: '))
y = x+1
z = 1

while y < 1:
      y = y - 1
      z = z*y

print (z)

eribol

#!/usr/local/bin/python
# _*_ coding: utf-8 _*_

x=int(input('Bir sayı girin: '))
z = 1

while x < 1:
      z = z*x
      x = x - 1
print (z)
Bu da aynı işi görür sanırım.

if

çalıştıramadım. Şu hatayı verdi:

Alıntı YapFile "faktöriyel.py", line 9
          y = y - 1
     ^
SyntaxError: invalid character in identifier

@eribol'un verdiğinde de bu hatayı aldım:
Alıntı YapFile "eribol.py", line 8
          z = z*x
     ^
SyntaxError: invalid character in identifier

:)

alquirel

Neden

while x > 1 :

değil de

while x < 1 :

Bu ikinci ifadenin anlamı şu: "x 1'den küçük olduğu sürece"
Dolayısıyla döngüye girmeden çıkmış oluyor. (Yani z 1 kalıyor)

raspacı

Amaç döngü kullanmaksa başka ama faktöriyel için sanırım şu kod da işe yarar.
#!/usr/local/bin/python
# _*_ coding: utf-8 _*_


def fak (x):
if x <= 1 :
return 1
else:
return x*fak(x-1)
x=int(input('Bir sayı girin: '))
print fak(x)
nereye gidersen git kendini de götürürsün.

neneki

@raspacı def ne işe yaradığını bilmiyorum daha ona gelmedim :) @raspacı alternatifler çok güzel teşekkürler.  ama @eribol yazdığın program faktöryel hesaplamıyor. mesela 4 yazınca 1 çıkıyor.

raspacı

#6
Fonksiyon tanımlıyor :)
Eribolun verdiği örnekte < işareti > olacak.
#!/usr/local/bin/python
# _*_ coding: utf-8 _*_

x=int(input('Bir sayı girin: '))
z = 1

while x > 1:
      z = z*x
      x = x - 1
print (z)
nereye gidersen git kendini de götürürsün.

alquirel

Alıntı yapılan: neneki - 06 Aralık 2010 - 13:22:15
@raspacı def ne işe yaradığını bilmiyorum daha ona gelmedim :) @raspacı alternatifler çok güzel teşekkürler.  ama @eribol yazdığın program faktöryel hesaplamıyor. mesela 4 yazınca 1 çıkıyor.

Yukarıda da belirttiğim üzere < (küçüktür) işareti döngüye girmeden sonlandırmış oluyor kodu.

ironic

 While döngüsü için şartın sağlanması lazım. Yoksa @alquirel in dediği gibi döngüye girmez. Döngüyü bir if ile sonlandırabiliriz.  :)


#!/usr/bin/env python

x = int(raw_input("Bir sayi girin: "))
z = 1

while True:
if x<1:
break
else:
z = z*x
x = x - 1
print z

utdmr

Bir öneri de benden olsun, lambda öğreniyorum :).

f=lambda n: (reduce(lambda x,y:x*y,range(1,n+1)))
Kişisel Blogum: Çoğunlukla Zararsız - cogunluklazararsiz.org
--
Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -and a lot of courage- to move in the opposite direction.

alquirel

Alıntı yapılan: utdmr - 06 Aralık 2010 - 14:39:23
Bir öneri de benden olsun, lambda öğreniyorum :).

f=lambda n: (reduce(lambda x,y:x*y,range(1,n+1)))

Tek satırda çok iş. Bi de izahını alalım biz bu satırın hocam :)

utdmr

Alıntı yapılan: alquirel - 06 Aralık 2010 - 15:10:23
Alıntı yapılan: utdmr - 06 Aralık 2010 - 14:39:23
Bir öneri de benden olsun, lambda öğreniyorum :).

f=lambda n: (reduce(lambda x,y:x*y,range(1,n+1)))

Tek satırda çok iş. Bi de izahını alalım biz bu satırın hocam :)
:). Sağdan sola doğru okursak;

1'den n+1'e kadar bir dizi al (range de sonuncu dahil olmadığı için n+1).
Bir de anonim fonksiyon tanımla; öyle ki bu fonksiyon x ve y parametresi alsın ve x*y döndürsün.
Reduce fonksiyonu da ikinci parametredeki dizinin ilk iki terimini alsın,  hazırladığımız çarpım fonksiyonuna göndersin, ve aldığı çarpımı gönderdiği ilk iki terim yerine koysun.
Son lambda ile asıl fonksiyonumuzu ilk range'ye n'i gönderecek şekilde tanımlayalım.

İlk range'nin örneğin n=4 için başına gelenler şu:

[1,2,3,4,5] >>> [2,3,4,5] >>> [6,4,5] >>> [24,5] >>> 210=5! (Eğer işlemleri doğru yaptıysam :) ).

Alıştıkça çok işe yarıyor şu lambda :).

Not: Bir yerde map ve reduce gibi fonksiyonların dizide "for" ile ilerlemekten daha kullanışlı olduğunu okumuştum.
Kişisel Blogum: Çoğunlukla Zararsız - cogunluklazararsiz.org
--
Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -and a lot of courage- to move in the opposite direction.

alquirel

Alıntı yapılan: utdmr - 06 Aralık 2010 - 15:44:24
Alıntı yapılan: utdmr - 06 Aralık 2010 - 14:39:23
Bir öneri de benden olsun, lambda öğreniyorum :).

f=lambda n: (reduce(lambda x,y:x*y,range(1,n+1)))

:). Sağdan sola doğru okursak;

1'den n+1'e kadar bir dizi al (range de sonuncu dahil olmadığı için n+1).
Bir de anonim fonksiyon tanımla; öyle ki bu fonksiyon x ve y parametresi alsın ve x*y döndürsün.
Reduce fonksiyonu da ikinci parametredeki dizinin ilk iki terimini alsın,  hazırladığımız çarpım fonksiyonuna göndersin, ve aldığı çarpımı gönderdiği ilk iki terim yerine koysun.
Son lambda ile asıl fonksiyonumuzu ilk range'ye n'i gönderecek şekilde tanımlayalım.

İlk range'nin örneğin n=4 için başına gelenler şu:

[1,2,3,4,5] >>> [2,3,4,5] >>> [6,4,5] >>> [24,5] >>> 210=5! (Eğer işlemleri doğru yaptıysam :) ).

Alıştıkça çok işe yarıyor şu lambda :).

Not: Bir yerde map ve reduce gibi fonksiyonların dizide "for" ile ilerlemekten daha kullanışlı olduğunu okumuştum.

Her ne kadar sonuç 120 olsa da cidden maharetliymiş bu lambda, reduce. :)
Anlatım için teşekkürler...

utdmr

Alıntı yapılan: alquirel - 06 Aralık 2010 - 15:53:02
Her ne kadar sonuç 120 olsa da cidden maharetliymiş bu lambda, reduce. :)
Benim hatam, 1,2 karışmış, yoksa kod doğru :).>>> f=lambda n: (reduce(lambda x,y:x*y,range(1,n+1)))
>>> f(5)
120
Kişisel Blogum: Çoğunlukla Zararsız - cogunluklazararsiz.org
--
Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -and a lot of courage- to move in the opposite direction.

guestwho

>>> from math import factorial
>>> factorial(input('Bir sayı giriniz: '))


:)
You want weapons? We're in a library. Books are the best weapon in the world. This room's the greatest arsenal we could have. Arm yourself!

raspacı

Bir python programcısının evrimini faktöriyel hesaplaması üzerinden anlatmış. Windows programcısı ve enterprise olanını sevdim :)
http://metaleks.net/programming/the-evolution-of-a-python-programmer
nereye gidersen git kendini de götürürsün.

neneki

@raspacı teşekkürler link için gayet hoşmuş incelerken bile eğlendim :)

kaansef

#17
Ben sahte kodunu yaptım.aşağıda veriyorum.

Başla
Sayısal toplam,sayi
toplam = 1
Yaz;"Bir sayı giriniz:"
iken sayi > 0:
toplam = toplam * sayi
sayi = sayi - 1
iken bitti
Yaz;"Girdiğiniz sayının faktöriyeli:",toplam
Bitir


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 24 Ocak 2011 - 15:34:09

Python ile yaptım.(Python 3.x ile.)

sayi = int(input("Bir sayı giriniz:"))
toplam = int(1)
while sayi > 0:
    toplam = toplam * sayi
    sayi = sayi - 1
print("Girdiğiniz sayının faktöriyeli:",toplam)
# 28065