Re: [cs-lisp] recursive function

2007-11-01 Başlik Vehbi Sinan Tunalioglu
(Bu eposta cs-lisp eposta listesine geldi. Aslinda Scheme ile degil,
Common-Lisp ile cevap isteniyor. Pek de fark yok aslinda. Comp/FM-149
ogrencileri icin de enteresan bir soru olacak. Lutfen dikkatle
okuyunuz. Aykut'un sorununu bizim yontemimizle cozecegiz.)

Merhaba Aykut.

Temel Kaynak: http://www.htdp.org

Sorunu cozmek icin sana daha temel bir oneri ile baslayayim. Once
programin tasarimi ile baslayalim. Verimiz nedir?

;; Veri tanimi:
;;
;; Sembol listesi

Sira keldi programin kontratina. Fonksiyonun ismi, aldigi girdiler ve
bunlarin tipleri ve geri dondurdugu tipi yazmamiz gerekiyor.

;; replace-symbol: (listof symbols) -> (listof symbols)

Fonksiyon ne ise yarar?

;; To replace 'a with 'e and 'b with 'd in a list of symbols.

Ornek verelim. Dikkat ornekler bizim icin cok onemli. Tum kritik
olasiliklari dusunmemiz gerekiyor.

(replace-symbol nil) -> nil
(replace-symbol '(a)) -> '(e)
(replace-symbol '(e)) -> '(e)
(replace-symbol '(b)) -> '(d)
(replace-symbol '(d)) -> '(d)
(replace-symbol '(a e b d c)) -> '(e e d d c)

Simdi sira geldi bir liste tuketen ve bunu isleyen bir programin
sablonuna. Bu sablon nasil hazirlanir? Temel olarak veri tipinden yola
cikiyoruz. Veri tipimiz aslen bir liste. Demek ki listeleri
tanimlamamiz gerekiyor:

A list is either:

1. empty, or
2. a pair of
   a. a value and
   b. a list.

Bu tanim bize kendine isaret eden (ya da basvuran: self-referential)
bir veri tipi tanimi. Yani ozyinelemeli (recursive) bir fonksiyon
kullanmamiz gerekiyor. Sablonu yazalim:

(defun replace-symbol (l)
  (cond
   ((null l) ...)
   (t ... (car l) ...
  ... (replace-symbol (cdr l)) ...)))

Veri tanimi ile sablonun nasil bir benzerlik gosterdigine dikkat!!!
Simdi sablonu bozmadan kodumuzu yazalim mi? Hayir. Siz yazin. Ama
dikkat: listenin ilk elemani bir sembol ve bu sembolu uygun bir
sekilde degistiren baska bir fonksiyon kullanmalisin. Aksi takdirde
sablon bozulacaktir. Butun bunlar buyuk problemlerin ustesinden
kolaylikla gelmek icin...

Son olarak da testlerini yapalim:

(equal (replace-symbol nil)  nil)
(equal (replace-symbol '(a)) '(e))
(equal (replace-symbol '(e)) '(e))
(equal (replace-symbol '(b)) '(d))
(equal (replace-symbol '(d)) '(d))
(equal (replace-symbol '(a e b d c)) '(e e d d c))

Butun bunlardan T (true) cevabinin donmesi gerekiyor.

Eger takildigin yer olursa tekrar sor, ama yaptigin seyleri yine
gonder ki yorum yapabilelim.

Son olarak: Kendi fonksiyonuna bakarsan, bir kontrat hazirlamadigin
icin liste geri gondermen gereken yerlerde 1, 'e, 'd gibi seyler
gonderdigini goreceksin. Aslinda kodun tamamen yanlis :)

COMP/FM 149 Ogrencileri: Siz de acilen Scheme ile ayni programi
tasarlayip yaziyorsunuz. Firsat bu firsat. 10 dakikalik bir is ve
ekstra odev size :)

--
vst


aykut "ÿe7aÿf0layan" <[EMAIL PROTECTED]> writes:

> I try to replace some elements of a list through using
> recursive function; but i cannot. Can you advise me?
>
>
> Function: replace a with e, and b with d.
> (defun replace (lst)
>   (cond ((null lst) 1)
> ((eq lst 'a) 'e)
> ((eq lst 'b) 'd)
> (t (cons ((car (lst)) (replace
> (cdr lst)))
>
> What is wrong with that code? 
>
>
>
> __
> Do You Yahoo!?
> Tired of spam?  Yahoo! Mail has the best spam protection around 
> http://mail.yahoo.com 
>
> ___
> cs-lisp mailing list
> cs-lisp@cs.bilgi.edu.tr
> http://church.cs.bilgi.edu.tr/lcg
> http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp


pgpmSd4ZHcnNk.pgp
Description: PGP signature
___
cs-lisp mailing list
cs-lisp@cs.bilgi.edu.tr
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp


RE: [cs-lisp] recursive function

2007-11-01 Başlik Emre Sevinc
-Original Message-
From: [EMAIL PROTECTED] on behalf of aykut "ÿe7aÿf0layan
Sent: Thu 11/1/2007 6:07 PM
To: cs-lisp@cs.bilgi.edu.tr
Subject: [cs-lisp] recursive function
 
> I try to replace some elements of a list through using
> recursive function; but i cannot. Can you advise me?

Merhaba, comp.lang.lisp'ten farkli olarak, buraya Turkce yazabilirsin, bu 
e-posta listesine abone olanlarin hemen hepsi Turkce biliyor.


> Function: replace a with e, and b with d.
> (defun replace (lst)
>   (cond ((null lst) 1)
> ((eq lst 'a) 'e)
> ((eq lst 'b) 'd)
> (t (cons ((car (lst)) (replace
> (cdr lst)))
>
> What is wrong with that code? 

Oncelikle CL'de zaten replace diye bir sey var, bunu belirtelim:

 http://www.lisp.org/HyperSpec/Body/fun_replace.html

HyperSpec dostumuzdur. O yuzden simdilik replace'i bozmak yerine my-replace 
diyelim.

Ardindan da soyle bir kod deneyelim:

(defun my-replace (lst)
  (cond ((null lst) '())
((eq (car lst) 'a) (append (list 'e) (my-replace (cdr lst
((eq (car lst) 'b) (append (list 'd) (my-replace (cdr lst
(t (append (list (car lst)) (my-replace (cdr lst))

Simdi bu kodu Turkce yazarsak:

- Eger lst null ise o zaman '() yani null dondur
- Eger lst'nin ilk elemani 'a ise o zaman e'yi liste yap ve dibine 
my-replace'in lst'nin geriye kalanina uygulanmis halini ekle
- Eger lst'nin ilk elemani 'b ise o zaman d'yi liste yap ve dibine 
my-replace'in lst'nin geriye kalanina uygulanmis halini ekle
- Eger bunlardan hicbiri degilse o zaman lst'nin ilk elemanini liste yap ve 
dibine my-replace'in lst'nin geriye kalanina uygulanmis halini ekle

(son kismi daha duzgun ve kitabina uygun bir sekilde yazabilir miyiz, bu, okura 
bir egzersiz olarak birakilmistir, pedagojik olmaya calisiyorum su anda)

Simdi bu kodu birkac ornek liste uzerinde denersek:

CG-USER(39): (my-replace '(x y z))
(X Y Z)
CG-USER(40): (my-replace '(a b c))
(E D C)
CG-USER(41): (my-replace '(z b a c d e f))
(Z D E C D E F)
CG-USER(42): (my-replace '())
NIL

Acaba bu aciklama yeterli geldi mi?

--
Emre Sevinc
___
cs-lisp mailing list
cs-lisp@cs.bilgi.edu.tr
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp


[cs-lisp] recursive function

2007-11-01 Başlik �ffffe7a�fffff0layan
I try to replace some elements of a list through using
recursive function; but i cannot. Can you advise me?


Function: replace a with e, and b with d.
(defun replace (lst)
  (cond ((null lst) 1)
((eq lst 'a) 'e)
((eq lst 'b) 'd)
(t (cons ((car (lst)) (replace
(cdr lst)))

What is wrong with that code? 



__
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 

___
cs-lisp mailing list
cs-lisp@cs.bilgi.edu.tr
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp