Archive for the ‘ Java Recursive Methods ’ Category

1/2!+1/3!+1/4!+…..+1/10! sonucunu bulan bir örnektir. Daha önce Java ile recursive hesaplama örneğini yazmıştım ama kodlamaya yeni başlayanlar için sorulan soru birazcık değiştirince takılıyoruz sanırım. Özellikle recursive metodlarda.
Aslında daha önce yazılan örnekten hiç bir farkı yok ama yinede sorulduğuna göre yazıyorum.

recursive sonuc

Faktoryel.java

package ethemsulan.com;

public class Faktoryel {
//recursive olaral faktoryeli hesaplar
	public double faktoryel(int n) {
		if (n <= 0) {
			return 1;
		} else {
			return n * faktoryel(n - 1);
		}
	}

	public static void main(String[] args) {
		Faktoryel nesne = new Faktoryel();
//toplam degeri tutar
		double toplam = 0;
		for (int i = 2; i <= 10; i++) {
//her birini ayri ayri toplar. Mesela i=2 icin 1/2! ve i=3 icin 1/3!... u toplar
			toplam += 1 / nesne.faktoryel(i);
//daha aciklayici olsun diye ekrana yazdiriyorum.
			System.out.println(1 + "/" + i + "!" + " --> " + 1 + "/"+ nesne.faktoryel(i));
		}
		System.out.println("+------------------------------------");
//tek tek toplandiktan sonra sonucu yazdiriyorum.
		System.out.println("1/2!+1/3!+1/4!+.....+1/10!: " + toplam);

	}

}

JSF, PrimeFaces ve JPA kullanarak dynamic olarak bir tree view oluşturmaya çalıştım. Yani dynamic olarak oluşturulabilen bir kategori uygulaması yazmaya çalıştım. Bunun için en önemli kısım aşağıda yazılan recursive methodtur.
Recursive method

//Dynamic tree viewi olutruan method.
    public  void recursive(List<Kategoriler> liste, int id,TreeNode node){
            subList2=new ArrayList<Kategoriler>();
            subList2=subKategori(id);
          for(Kategoriler k:subList2){
            TreeNode childNode=new DefaultTreeNode(k.getKategoriAdi(), node);
//Veritabaninda kategori tablosunu tree view seklinde dynamic olarak olusturmayi saglar.
             recursive(subList2, k.getKategoriId(),childNode);
          }

Mesela örnekte donanım altına telefon ve onun da altına android kategorleri ekleyebilmek için recursive olarak yazmak gerekiyor.
Tek tablo ile bütün kategorileri tutuyorum. Aşağıdaki resimde görüldüğü gibi hangi kategoriye alt kategori ekliyorsam onun id sini alıyorum ve kat_ust_id olarak kaydediyorum. En temelde kategorler diye bir node oluşturdum ve onun ust id si 0 dır. Yani sağdaki hiç bir id ile aynı değil.

database table


Aşağıdaki şekilde de anlaşıldığı gibi önce bir ana kategori seçip ve alt kategori ismi girilerek istediğimiz kadar alt kategori girebiliriz.

Yukardaki örnekte üst kategori Donanım ve alt kategori de Telefon olarak oluşturuldu.

android


Parent node: Telefon child node: Android

Yukardaki işlemleri sağlayan jsf bean ve index.xhtml
JSF PrimeFaces Datatable Pagination Example
index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <ul id="d">

        </ul>
        <h:form>
            <p:panel id="panelId">
                <p:tree value="#{nodeBean.root}" var="node" dynamic="true"
                        selectionMode="single" selection="#{nodeBean.selectedNode}">
                    <p:treeNode>
                        <h:outputText value="#{node}"/>
                    </p:treeNode>
                </p:tree>
                <h:panelGrid columns="2">
                    <h:outputLabel value="Alt kategori ismi*:"/>
                    <h:inputText id="id" value="#{nodeBean.kategIsmi}" required="true">
                        <f:validateLength minimum="1" maximum="30"/>
                    </h:inputText>
                    <p:commandButton value="Yeni Kategori Ekle" update="panelId" action="#{nodeBean.yeniKatEkle}" async="true"/>

                </h:panelGrid>
                <h:message for="id"/>
            </p:panel>
        </h:form>

        <h:form>
            <p:panel>
                <p:column>
                    <h:commandButton action="edit" value="Edit Sayfasina Gidin"/>
                </p:column>
            </p:panel>
        </h:form>

    </h:body>
</html>

NodeBean.java


package com.Bean;

import com.kategori.Kategoriler;
import com.kategori.KategorilerJpaController;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.primefaces.event.NodeSelectEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;


/**
 *
 * @author ubuntu
 */
public class NodeBean {

    private TreeNode root;
    private TreeNode donanim;
    private TreeNode selectedNode;
    private static  List<Kategoriler> liste;
    private static List<Kategoriler> araListe;
    private KategorilerJpaController katCont;
    private Kategoriler katNesnesi;
    private List<Kategoriler> subList2;
    private String kategIsmi;
    public NodeBean() {
        liste=new ArrayList<Kategoriler>();
        root=new DefaultTreeNode("Root",null);
        katCont=new KategorilerJpaController();
        liste=katCont.findKategorilerEntities();
        donanim=new DefaultTreeNode("", root);
//Butun kategorileri tutan bir ana kategori olusturuyor.
//Dynamic olarak sub kategori ekliyor. Recursive olarak hepsini kontrol edilmesi lazim.
        recursive(liste, 0,donanim);

    }
//Dynamic tree viewi olutruan method.
    public  void recursive(List<Kategoriler> liste, int id,TreeNode node){
            subList2=new ArrayList<Kategoriler>();
            subList2=subKategori(id);
          for(Kategoriler k:subList2){
            TreeNode childNode=new DefaultTreeNode(k.getKategoriAdi(), node);
//Veritabaninda kategori tablosunu tree view seklinde dynamic olarak olusturmayi saglar.
             recursive(subList2, k.getKategoriId(),childNode);
          }

    }
//herhangi bir tree nodenin childlarini buluyor.
    public static List<Kategoriler> subKategori(int i)
    {
        araListe=new ArrayList<Kategoriler>();
        for(Kategoriler k:getListe()){
            if(k.getKatUstId()==i){
                araListe.add(k);
            }
        }
        return araListe;
    }
    public static List<Kategoriler> getListe() {
        return liste;
    }
    public Kategoriler getKatNesnesi() {
        return katNesnesi;
    }
    public void setKatNesnesi(Kategoriler katNesnesi) {
        this.katNesnesi = katNesnesi;
    }
    public TreeNode getRoot() {
        return root;
    }
    
    public TreeNode getSelectedNode() {
        return selectedNode;
    }

    public void setSelectedNode(TreeNode selectedNode) {
        this.selectedNode = selectedNode;
    }
    public void secilenNode(NodeSelectEvent event){
        FacesMessage msg=new FacesMessage(FacesMessage.SEVERITY_INFO, "selected", event.getTreeNode().getData().toString());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
   
    public String getKategIsmi() {
        return kategIsmi;
    }

    public void setKategIsmi(String kategIsmi) {
        this.kategIsmi = kategIsmi;
    }


    public void yeniKatEkle(){
//        JOptionPane.showMessageDialog(null,katCont.kategoriIdDonder(getSelectedNode().getData().toString()).getKategoriId());
        katNesnesi=new Kategoriler(getKategIsmi(), katCont.kategoriIdDonder(getSelectedNode().getData().toString()).getKategoriId());
         katCont.create(katNesnesi);
         setKategIsmi(null);
    }
    
}

pagination

Edit.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <p:panel header="PrimeFaces ile listeleme">
                <p:dataTable value="#{editBean.allRecordList}" var="items" paginator="true"
                             rows="5" rowsPerPageTemplate="5,10,30"
                             paginatorTemplate="{FirstPageLink} {PageLinks} {NextPageLink}
                             {RowsPerPageDropdown}">
                    <p:column>
                        <f:facet name="header">Ad</f:facet>
                        <h:outputText value="#{items.kategoriAdi}"/>
                    </p:column>
                    <p:column>
                        <f:facet name="header">Ust Kategori Id</f:facet>
                        <h:outputText value="#{items.katUstId}"/>
                    </p:column>
                    <p:column>
                        <f:facet name="header">Edit</f:facet>
                        <h:outputLink value="EditComplete.xhtml">
                            <f:param name="id" value="#{items.kategoriId}"/>Düzenle
                        </h:outputLink>
                    </p:column>
                </p:dataTable>
                <h:outputLink value="index.xhtml">Ana Sayfa</h:outputLink>
            </p:panel>
        </h:form>
    </h:body>
</html>

EditBean.java

package com.Bean;

import com.kategori.Kategoriler;
import com.kategori.KategorilerJpaController;
import com.kategori.exceptions.NonexistentEntityException;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;


/**
 *
 * @author ubuntu
 */
public class EditBean {
    private KategorilerJpaController contObje;
    private Kategoriler kategoriObje;
    private List<Kategoriler> allRecordList;

    public List<Kategoriler> getAllRecordList() {
        return allRecordList;
    }
    public Kategoriler getKategoriObje() {
        return kategoriObje;
    }
    public void setKategoriObje(Kategoriler kategoriObje) {
        this.kategoriObje = kategoriObje;
    }
    public void setAllRecordList(List<Kategoriler> allRecordList) {
        this.allRecordList = allRecordList;
    }
    
    public EditBean() {
        contObje=new KategorilerJpaController();
        allRecordList=contObje.findKategorilerEntities();
        kategoriObje=new Kategoriler();
//Request nesnesi olusturup <h:outputLink> ile
//<f:param name="id" value="#{items.kategoriId}"/> degeri aliniyor
        FacesContext context=FacesContext.getCurrentInstance();
        HttpServletRequest request=(HttpServletRequest) context.getExternalContext().getRequest();
        if(request.getParameter("id")!=null){
            int katId=Integer.parseInt(request.getParameter("id"));
            kategoriObje=contObje.findKategoriler(katId);
        }
    }
    public void editCpmlete() throws NonexistentEntityException, Exception{
//<h:selectOneMenu value="#{editBean.kategoriObje.katUstId}"> ta ust kategori secilir ve
//<h:inputText value="#{editBean.kategoriObje.kategoriAdi}" required="true"/> alanina da kategori ismi duzenlenir
//secilen deger ve kategori adi edi() hazir medotu ile guncellenir bilgiler. Bu da kategorId primarykey iel guncellenir.
        contObje.edit(kategoriObje);
    }
//reset ile nesneye null deger atadim.
    public void reset(){
        getKategoriObje().setKatUstId(null);
        getKategoriObje().setKategoriAdi(null);
        getKategoriObje().setKategoriId(null);
    }
}

select menu

EditComplete.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <p:panel>
                <h:inputHidden value="#{editBean.kategoriObje.kategoriId}"/>
                <h:panelGrid columns="2" id="yenile">
                    <h:outputText value="Kategori Adi"/>
                    <h:inputText value="#{editBean.kategoriObje.kategoriAdi}" required="true"/>
                    <h:outputText value="Ust Kategori ID"/>
                    <h:selectOneMenu value="#{editBean.kategoriObje.katUstId}">
                        <f:selectItems value="#{editBean.allRecordList}" var="items"
                                       itemLabel="#{items.kategoriAdi}" itemValue="#{items.kategoriId}"/>
                    </h:selectOneMenu>
                    <h:commandButton value="Kaydet" action="#{editBean.editCpmlete}"/>
                    <p:commandButton value="Reset" action="#{editBean.reset}" update="yenile"/>
                </h:panelGrid>
            </p:panel>
            <p:button outcome="geri" value="Geri Don"/>
        </h:form>
    </h:body>
</html>

Kategoriler.java

package com.kategori;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

/**
 *
 * @author ubuntu
 */
@Entity
@Table(name = "kategoriler")
@NamedQueries({
    @NamedQuery(name = "Kategoriler.findAll", query = "SELECT k FROM Kategoriler k"),
    @NamedQuery(name = "Kategoriler.findByKategoriId", query = "SELECT k FROM Kategoriler k WHERE k.kategoriId = :kategoriId"),
    @NamedQuery(name = "Kategoriler.findByKategoriAdi", query = "SELECT k FROM Kategoriler k WHERE k.kategoriAdi = :kategoriAdi"),
    @NamedQuery(name = "Kategoriler.findByKatUstId", query = "SELECT k FROM Kategoriler k WHERE k.katUstId = :katUstId")})
public class Kategoriler implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "kategori_id")
    private Integer kategoriId;
    @Basic(optional = false)
    @Column(name = "kategori_adi")
    private String kategoriAdi;
    @Column(name = "kat_ust_id")
    private Integer katUstId;

    public Kategoriler() {
    }

    public Kategoriler(Integer kategoriId) {
        this.kategoriId = kategoriId;
    }

    public Kategoriler(String kategoriAdi) {
        this.kategoriAdi = kategoriAdi;
    }

    public Kategoriler(Integer kategoriId, String kategoriAdi) {
        this.kategoriId = kategoriId;
        this.kategoriAdi = kategoriAdi;
    }

    public Kategoriler(String kategoriAdi, Integer katUstId) {
        this.kategoriAdi = kategoriAdi;
        this.katUstId = katUstId;
    }

    public Integer getKategoriId() {
        return kategoriId;
    }

    public void setKategoriId(Integer kategoriId) {
        this.kategoriId = kategoriId;
    }

    public String getKategoriAdi() {
        return kategoriAdi;
    }

    public void setKategoriAdi(String kategoriAdi) {
        this.kategoriAdi = kategoriAdi;
    }

    public Integer getKatUstId() {
        return katUstId;
    }

    public void setKatUstId(Integer katUstId) {
        this.katUstId = katUstId;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (kategoriId != null ? kategoriId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Kategoriler)) {
            return false;
        }
        Kategoriler other = (Kategoriler) object;
        if ((this.kategoriId == null && other.kategoriId != null) || (this.kategoriId != null && !this.kategoriId.equals(other.kategoriId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.kategori.Kategoriler[kategoriId=" + kategoriId + "]";
    }

}

persistence


persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="KategorilerPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <non-jta-data-source/>
    <class>com.kategori.Kategoriler</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
      <property name="hibernate.connection.username" value="root"/>
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
      <property name="hibernate.connection.password" value="123"/>
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/odev"/>
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
  </persistence-unit>
</persistence>

faces-config


faces-config.xml

<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="2.0"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
    <navigation-rule>
        <from-view-id>/index.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>edit</from-outcome>
            <to-view-id>/Edit.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
    <managed-bean>
        <managed-bean-name>nodeBean</managed-bean-name>
        <managed-bean-class>com.Bean.NodeBean</managed-bean-class>

        <managed-bean-scope>request</managed-bean-scope></managed-bean>
    <managed-bean>
        <managed-bean-name>editBean</managed-bean-name>
        <managed-bean-class>com.Bean.EditBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <navigation-rule>
        <from-view-id>/EditComplete.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>geri</from-outcome>
            <to-view-id>/Edit.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
</faces-config>

Ben NetBeans 6.9.1 kullandığımdan PrimeFaces default olarak gelmiyor. Bunun için
1. primafaces-2.2.1.jar kütüphanesini ekledim
2. web-fragment.xml dosyasını oluşturdum. Aşağıda o dosya içeriği var.
3.

xmlns:p="http://primefaces.prime.com.tr/ui"

xml namespacesini ekledim.

web-fragment.xml

<web-fragment xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd"
	version="3.0">

	<name>PrimeFaces</name>

    <servlet>
		<servlet-name>PrimeFaces Resource Servlet</servlet-name>
		<servlet-class>org.primefaces.resource.ResourceServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>PrimeFaces Resource Servlet</servlet-name>
		<url-pattern>/primefaces_resource/*</url-pattern>
	</servlet-mapping>

</web-fragment>

Uygulamayi indirmek için tiklayin. Ubuntuda uygulamayı .zip haline getiriyorum. Eğer açamazsanız veya link bozuksa dm atabilirim.

Amaç A,B,C,D,E,F,G,H,I harflerini 3×3 lük matriste aynı satır ve sütuna aynı harf gelmemek şartıyla kaç farklı şekilde sıralarız?
ilk
Örnek sıralama 2
ikinci
Örnek sıralama 3
uc
Yukardaki şekilde farklı sıralamaya çalışıyorum.
Eğer A seçilirse geriye I, H, F,E den biri gelebilir.Bunu test metodumuzda yazıyorum.
rt
Aynı şekilde eğer E seçilirse I, G, C, A dan biri gelebilir. ayniHarfSatirVeSutundaVarMi() metodun içinde test ediyorum.
esec
Eğer F seçilirse A,C,G,I den biri gelebilir. Yani seçilen harfın satır ve sutununu siliyorum geri kalanlardan biri gelirse true dönderir.Ben bu şekilde düşündüm.
ret
Ilk 6 durumın ekran çıktısı
trye
Son çıktı
tryu
Çözüm: 3×3 luk matriste 9 kutucuk var.
1.kutucuk: 9 sayidan biri gelebilir(0,1,2,3,4,5,6,7,8)
2.kutucuk: 8 sayidan biri gelebilir(0.kutucukta biri kullanildi)
3.kutucuk: 7 sayidan biri gelebilir
4.kutucuk: 6 sayidan biri gelebilir
5.kutucuk: 5 sayidan biri gelebilir
6.kutucuk: 4 sayidan biri gelebilir
7.kutucuk: 3 sayidan biri gelebilir
8.kutucuk: 2 sayidan biri gelebilir
9.kutucuk: 1 sayidan biri gelebilir
Yani toplam 9! (9 faktoryel) farkli sekilde siralama yapilabilir.
9!=362880 farklı durum var.

package ethemsulan.com;

import java.util.ArrayList;

public class HarfSiralama {
		static String[] dizim=new String[9];
		static String[] kulHarfler={"A","B","C","D","E","F","G","H","I"};
		static ArrayList<String> oncekiDurumKiyasla=new ArrayList<String>();
	public static void main(String[] args) {
//Baslangic degerlerini null atadik
		for(int i=0;i<9;i++){
			dizim[i]="";
		}
//Recursive metodumuzu cagiriyor
		HarfSiralama.durumlariBul(0);
	}
	static int sayac=0;
	static int ilkAltiDurum=0;
	private static void durumlariBul(int kutu) {
//Durumlar fazla oldugundan ilk alti durumu consolde gormek icin alt satirdaki(if(ilkAltiDurum==6){System.exit(0);}) yorumu kaldirin.
//Kodu calistirinca ilk durum ABCDEFGHİ  ve son durum(yani 362880. durum) İHGFEDCBA oldugunu gorurusunuz.
//		if(ilkAltiDurum==6){System.exit(0);}
		//Durumlari test et eger istenen deger sagliyorsa ekrana yaz. Biz dizideki degerleri
//yazacagimizdan istenen deger dizi boyutudur.yani 9
		if(kutu==9){
			sayac++;
			ilkAltiDurum++;
			int uc=0;
//Her bulunan degeri topla ve(yani her bir siralamayi oncekilerle kiyasla aynisi varsa exit(0) ile islemi durdur)
			String ayniMi="";
			System.out.println(sayac+" . durum");
			for(int i=0;i<9;i++)
			{
				System.out.print(dizim[i]);
				ayniMi+=dizim[i];
				uc++;
				if(uc==3){
					System.out.println("");
					uc=0;
				}
			}
// onceki durumlarla kiyasla eger ayni iki durum varsa System.exit(0) ile islemi durdur.
			if(oncekiDurumKiyasla.contains(ayniMi)){
				System.out.println(ayniMi+" daha onceden varmis");
				System.exit(0);
			}else{
				oncekiDurumKiyasla.add(ayniMi);
			}
			return;
		}
//Asil islem yeri burasidir. Aranan durum test et  ve tum durumlari gozden gecir
		for (String harf : kulHarfler) {
//Eger bu sayi kullanildiysa ayni satir ve sutunda bir daha kullanilmasin diye geciyoruz.Yani bir sonraki duruma bakiyoruz
			if(buHarfDahaOnceKullanildiMi(harf)==false){
				continue;
			}
//Ayni harf satir ve sutuna gelmemesi lazim.Cunku sartimiz ayni harf satir ve sutuna gelmemek sartiyla kac farkli
//sekilde yerlestirme yapabiliriz.Ornek yerlestirme resimde var.Ayni harf yoksa test dogru
			else if(ayniHarfSatirVeSutundaVarMi(dizim[kutu],harf)){
				dizim[kutu]=harf;
				durumlariBul(kutu+1);
				dizim[kutu]="";
			}
		}
	}
//Eger dizi de hic deger yoksa ilk gelen degeri ekle.Eger deger varsa kontrol et. Eger a gelmisse E, F,H, İ den biri ancak gelebilir
	private static boolean ayniHarfSatirVeSutundaVarMi(String varOlanHarf, String gelOlHarf) {
//ABCDEFGHİ VE İHGFEDCBA durumlarini iki farkli durum olarak yazilmasini saglar.Gercekten de iki farkli durumdur.
		if(varOlanHarf.equals("")){
			return true;
		}
		else if(varOlanHarf.equals("A")&& (gelOlHarf.equals("E") | gelOlHarf.equals("F") | gelOlHarf.equals("H") | gelOlHarf.equals("I")))
		{
			return true;
		}
		else if(varOlanHarf.equals("B")&& (gelOlHarf.equals("D") | gelOlHarf.equals("F") | gelOlHarf.equals("G") | gelOlHarf.equals("I")))
		{
		return true;
		}
		else if(varOlanHarf.equals("C")&& (gelOlHarf.equals("D") | gelOlHarf.equals("E") | gelOlHarf.equals("G") | gelOlHarf.equals("H")))
		{
		return true;
		}
		else if(varOlanHarf.equals("D")&& (gelOlHarf.equals("B") | gelOlHarf.equals("C") | gelOlHarf.equals("H") | gelOlHarf.equals("I")))
		{
		return true;
		}
		else if(varOlanHarf.equals("E")&& (gelOlHarf.equals("A") | gelOlHarf.equals("C") | gelOlHarf.equals("G") | gelOlHarf.equals("I")))
		{
		return true;
		}
		else if(varOlanHarf.equals("F")&& (gelOlHarf.equals("A") | gelOlHarf.equals("B") | gelOlHarf.equals("G") | gelOlHarf.equals("H")))
		{
		return true;
		}
		else if(varOlanHarf.equals("G")&& (gelOlHarf.equals("B") | gelOlHarf.equals("C") | gelOlHarf.equals("E") | gelOlHarf.equals("I")))
		{
		return true;
		}
		else if(varOlanHarf.equals("H")&& (gelOlHarf.equals("A") | gelOlHarf.equals("C") | gelOlHarf.equals("D")| gelOlHarf.equals("F")))
		{
		return true;
		}
		else if(varOlanHarf.equals("I")&& (gelOlHarf.equals("A") | gelOlHarf.equals("B") | gelOlHarf.equals("D") | gelOlHarf.equals("E")))
		{
		return true;
		}
		return false;
	}
//Harf dizide varsa false donder. Yeni bir harf ise yani dizide yoksa true donder.
	private static boolean buHarfDahaOnceKullanildiMi(String harf) {
		for(int i=0;i<9;i++){
			if(dizim[i].equals(harf))
				return false;
		}
		return true;
	}

}

Sayılarla yapılmış örneğe bakmak için tıklayın.Ikisinde de aynı mantık var

Aynı şekilde çözülmüş başka bir örnek. Resimli olarak gösterilmiş.

Şartımız aynı satır ve sütuna aynı sayı gelmeyecek şekilde 0,1,2,3,4,5,6,7,8 sayılarını 3×3 lük matriste kaç farklı şekilde sıralarız?

İlk ve son durum çiktilari:ilk

son

package ethemsulan.com;
import java.util.ArrayList;
public class Puzzle {
	  static int[] dizi=new int[9];
	  static ArrayList kontrol = new ArrayList();

//Durumlar cok fazla(362880 durum) oldugundan hepsini consoleden goremiyoruz.Ilk 5 durumu gostermek<br />
//icin if(ilkBesDurum==5) tek, satirin yorumunu kaldiriniz<br />
	    static int ilkBesDurumuGoster=0;
	    static int sayac=0;
	    public void durumBul(int kutu){
//if(ilkBesDurumuGoster==5){ System.exit(0);}
	        if(kutu==9){
//Kutu 9 oldugunda yani aranan sartlar dizi dolmussa (mesela 0 1 2 3 4 5 6 7 <img src="http://www.ethemsulan.com/wp-includes/images/smilies/icon_cool.gif" alt="8)" class="wp-smiley"> durum olarak ekrana yaziyor ve sayac artiyor
	            sayac++;
	            ilkBesDurumuGoster++;
	            System.out.print(sayac+" .durum\n");
	            int uc=0;
	            String str =null;
	            for(int i=0;i<9;i++)
	            {
	                System.out.print(dizi[i]);
	                str += dizi[i];
	                uc++;
	                if(uc==3){
	                	System.out.println();
	                	uc=0;
	                }
	            }
//Bulunan durum oncekilerle karsilastiriliyor.Eger ayni durum varsa System.exit(0);ile programi durduruyor&lt;br /&gt;<br />
//Ayni durum yoksa else kisminda var olan durumlara ekliyor ki sonra gelenler ile karsilastirilsin.&lt;br /&gt;<br />
	            if( kontrol.contains(str) ){
	            	System.out.println(str +  "daha onceden varmis");
	            	System.exit(0);
	            } else {
	            	kontrol.add(str);
	            }
   System.out.println();
	            return;
	        }
//Bu sayi dizi de kullanildi mi? Cunku bizim sartimiz bir sayi ayni satir ve sutunda 2 sefer kullanilamaz.&lt;br /&gt;<br />
	        for(int i=0;i<9;i++){
	        	if(dahaOnceKullanildiMi(i)==false){
	                continue;
                        
	            }
                    
//Test aradigimiz sart saglaniliyor mu?
	            else if(test(kutu,i)){
	                dizi[kutu]=i;
	                durumBul(kutu+1);
	                dizi[kutu]=-1;
	            }
	        }
	    }
	    public boolean dahaOnceKullanildiMi(int sayi){
	        for(int j=0;j<dizi.length;j++){
	            if(dizi[j]==sayi){
	                return false;
	            }
	        }
        return true;
	    }
		public boolean test(int kutu, int b){
//Ornegin ilk calistiginda ve 0 gelince dizi bos oldugundan (dizi[0]==-1) ilk gelen elamani ekle yani true donder.
	    	if(dizi[kutu]==-1){
	    		return true;
	    	}
//Bunlar link verilen benzer ornekte resimli olarak gosterilmistir.Cunku bu sartlarin anlasilmasi lazim.
	        if(kutu==0 &&(b==4 | b==5 | b==7 | b==8)){
	            return true;
	        }else if(kutu==1 && (b==3 | b==5 | b==6 | b==8)){
	            return true;
	        }else if(kutu==2 &&(b==3 | b==4 | b==6 | b==7)){
	            return true;
	        }else if(kutu==3 &&(b==1 | b==2 | b==7 | b==8)){
	            return true;
	        }else if(kutu==4 &&(b==0 | b==2 | b==6 | b==8)){
	            return true;
	        }else if(kutu==5 &&(b==0 | b==1 | b==6 | b==7)){
	            return true;
	        }else if(kutu==6 &&(b==1 | b==2 | b==4 | b==5)){
	            return true;
	        }else if(kutu==7 &&(b==0 | b==2 | b==3 | b==5)){
	            return true;
	        }else if(kutu==8 &&(b==0 | b==1 | b==3 | b==4)){
	            return true;
	        }
	        return false;
	    }
	    public static void main(String[] args) {
	    	Puzzle nesnem=new Puzzle();
	        for(int i=0;i<9;i++){
	            dizi[i]=-1;
	        }
	         nesnem.durumBul(0);
	    }
}

Orjinal kod

Sınıf Diagramları Test.java ve Aşağıdaki Kodların Hepsi Için Tıklayın(Ana Sınıf)
Pizza.java

package Pizza;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import ethemsulan.com.Malzeme;
import ethemsulan.com.MalzemeListesi;
public abstract class Pizza
{
	protected static double karOrani=0;
//Malzeme ismi ve fiyati tutan HashMap.
	protected Map<String, Integer> gerekliMalzeme=new HashMap<String, Integer>();
	protected MalzemeListesi ml = null;
	protected int satisFiyati = 0;
	private double kalanMalzeme=0;
	MalzemeListesi enSon_kalan_malzemeler=null;
//Piza olsuturmaya yetecek kadar menu varsa true donderir.
	public boolean pizzaYap()
	{
//pizzaYap() metodu cagrildiginda istenen malzeme miktari mevcutsa o zaman toplamdan dusuruluyor ve
//menu olusturuluyor
		boolean kontrol=malzemeYetiyormu();
		Iterator it=gerekliMalzeme.keySet().iterator();
		double hesaplananOran = 0.0;
//Malzeme yetmiyorsa bir islem gerceklestirilimiyor
		if(kontrol){
		while (it.hasNext())
		{
			Object gecerlimalzeme = it.next();
			int miktar=gerekliMalzeme.get(gecerlimalzeme);
			String isim=gecerlimalzeme.toString();

			Malzeme m = ml.getMalzeme(isim);
			kalanMalzeme=0;
//Ikinci sefer gene malzeme miktari yetip yetmedigi kontrol ediliyor.Bunu yazmazsakta olur
			if( m != null && m.getMiktar() >= miktar){
				m.miktarDusur(miktar);
//Miktar gr oldugundan /1000 diyecez. kg cinsindendir.
				hesaplananOran += (miktar / 1000.0) * m.getFiyat();
				this.kalanMalzeme=hesaplananOran;
			}
		}
		return true;
		}
		return false;

	}
//Istenen menude kullanilan malzeme miktari kontrol ediliyor.
//Eger uretilecek menude yeterince mealzeme varsa true donderir.Bir tane bile eksik malzeme varsa
//false donderiyor
	public boolean malzemeYetiyormu(){
		Iterator it=gerekliMalzeme.keySet().iterator();
		while (it.hasNext())
		{
			Object gecerlimalzeme = it.next();
			int miktar=gerekliMalzeme.get(gecerlimalzeme);
			String isim=gecerlimalzeme.toString();
			Malzeme m = ml.getMalzeme(isim);
			if( m != null && m.getMiktar() < miktar ){
				return false;
			}
		}
		return true;
	}
//O anda hangi menu uretiliyorsa bir ust dugume(syotu olarak) ciktiginda
//son uretilen menuı malzemeleri geri ekleniliyor.Bu geri ekleme sanki bir ust dugume
//cikmis gibi oluyor.
	public void pizzayaGeriEkle(){
		Iterator it=gerekliMalzeme.keySet().iterator();
		while (it.hasNext())
		{
			Object gecerlimalzeme = it.next();
			int miktar=gerekliMalzeme.get(gecerlimalzeme);
			String isim=gecerlimalzeme.toString();

			Malzeme m = ml.getMalzeme(isim);
			m.miktarEkle(miktar);
		}
	}
//Butun menuler uretildikten sonra kalan malzemeler cope gittiginden bunlar zarar olarak hesaplaniliyor.
//Burada bu malzemeler ne kadar tutugunu hesapliyor ve kar orani hesaplanacagi yerde bunu zarar olarak cikartiyoruz.
	public double kalanMalzeme(){
		kalanMalzeme=0;
		Iterator it=gerekliMalzeme.keySet().iterator();
		while (it.hasNext())
		{
			Object gecerlimalzeme = it.next();
			int miktar=gerekliMalzeme.get(gecerlimalzeme);
			String isim=gecerlimalzeme.toString();
			Malzeme m = ml.getMalzeme(isim);
			kalanMalzeme += (m.getMiktar() / 1000.0) * m.getFiyat();
		}
		return kalanMalzeme;
	}

}

Ana Sınıf
Malzeme.java

package ethemsulan.com;

public class Malzeme
{
//Mlazemeismi,miktari ve fiyati.Mesela sogan,100 gr ve 1 ytl kilosu
	private String isim;
	private int miktar=0;
	private int fiyat;
	public Malzeme(String isim, int miktar, int fiyat) {
		this.isim=isim;
		this.miktar=miktar;
		this.fiyat=fiyat;
	}

	public String getIsim()
	{
		return isim;
	}

	public int getMiktar() {
		return miktar;
	}

	public int getFiyat() {
		return fiyat;
	}
//Tek tek miktarlari dusuruyor.Mesela sogan kullanilan miktar kadar toplamdan dusuluyor.
	public void miktarDusur(int miktar)
	{
		this.miktar -=miktar;
	}
	public void miktarEkle(int miktar){
		this.miktar+=miktar;
	}
}

Ana Sınıf
MalzemeListesi.java

package ethemsulan.com;

import java.util.ArrayList;

public class MalzemeListesi {
//Başlangıç malzemeleri bu listeye ekliyoruz.
	public ArrayList<Malzeme> liste = new ArrayList<Malzeme>();
//Malzeme ekliyor
	public void addMalzeme(Malzeme m)
	{
		liste.add(m);
	}
//Gelen malzeme ismi listede varsa donderirir.
	public Malzeme getMalzeme(String isim)
	{
		for (Malzeme m : liste) {
			if( m.getIsim().equals(isim) )
				return m;
		}

		return null;
	}
//O anda kalan malzemeleri yazar.
	public void sonDurumuYazdir()
	{
		for (Malzeme m : liste) {
			System.out.println( m.getIsim() + ": " + m.getMiktar() );
		}
	}

}

Ana Sınıf
MenuUretRecursive.java

package ethemsulan.com;

import Pizza.AciliVejeteryan;
import Pizza.Mantar;
import Pizza.Pizza;
import Pizza.Sucuklu;
import Pizza.Vejeteryan;

public class MenuUretRecursive{
	public static int vejeteryanToplam=0;
	public static int sucukluToplam=0;
	public static int mantarliToplam=0;
	public static int aciliVejeteryanToplam=0;
	static double enKarliDurum=0;
	private static double toplamKarimiz=0;
//Ilk olarak vejeteryan uretiyoruz.
	static int vejeteryanSon=0;
	static int sucukSon=0;
	static int mantarSon=0;
	static int aciSon=0;
	public static double zarar=0;
	private double toplamSatis=0;
	public static double satisFiyati=0;
	public void menuUret(MalzemeListesi ml) {
		Vejeteryan v1=new Vejeteryan(ml);
//Mlazeme yetiyor mu diye kontrol ediyor.Yani kalan malzeme bir tane vejeteryan pizza uretmeye yetiyor mu?
//Eger yetmiyorsa sucukluya geciyor.Yani bir sonraki durumu kontrol ediliyor.Yetiyorsa
		if(v1.malzemeYetiyormu()){
//Pizza yapiyor
//Vejeteryan nesnesi uretildigi anda vejeteryan icin harcanan malzeme miktari toplam
//miktardan dusurulur. Eger vejeteryan uretilebiliyorsa true donderir.
			if(v1.pizzaYap()){
				vejeteryanToplam+=1;
			}
//Pizzaci elindeki malzemelerle kac tane vejeteryanli, kac tane sucuklu ve
//kac tane acili vejeteryan yaparsa en cok kar eder.Eger bu bilgi elinde varsa
//Gelen musteriye size sunnu tavsiye edebiliriz seklinde bir imkani olur.Bazi musteriler
//hangisini tavsiye edersiniz diye sorarlar.
			durumlariKontrolEt(ml, v1);
//Vejeteryan uretildise sayisi bir artiyor
//Recusrive olarak kendi kendini cagirir. Bu tur problemler, butun durumlarin test edilebilmesi
//icin recursive yazilmalilar.Vejeteryan olsuturuluncaya kadar surekli vejeteryan olusturur.Sonra
//Artik kalan malzemeyle yeni bir vejeteryan menusu olusturulamiyorsa diger menuleri test etmeye basliyor.
			menuUret(ml);
//Diyelim 2 tane vejeteryan, 3 tane sucuklu olusturdu ve kalan malzemeden hic bir menu uretilemiyorsa
//en son menude harcanan malzeme geri ekleniyor ve bir sonraki durum test ediliyor.yani 2 vejeteryan ve
//2(once 3 tu) sucukludan sonra eger eklenen malzeme acili yapmaya yetiyorsa acili olusturur.
//Yetmiyorsa bu sefer bir ust node(soyut olarak node) cikar ve o node icin harcanan malzeme geri eklenilir toplam
//malzeme miktarina.Bu sekilde tum durumalr test edilir.
			v1.pizzayaGeriEkle();
//Bir ust node cikarken yukarda 3 taneden 2 ye dusuru yani 1 azaltir sayiyi.
			if(vejeteryanToplam>0){
				vejeteryanToplam-=1;
			}
		}
//Bunlarda ayni Vejeteryan mantigiyla calisiyorlar.Mesela bir test yapabiliriz.Once vejeteryan
//ilk uretmeye baslatin sonra asagidaki sucukluyu vejeteryandan onceye koyun.Eger ikisinin sonucu ayni ise
//demek ki program tum durumlari kontrol ediyor.Yada acilivejeteryani ilk siraya alin.
		Sucuklu s1=new Sucuklu(ml);
		if(s1.malzemeYetiyormu()){
			if(s1.pizzaYap()){
				sucukluToplam+=1;
			}
			durumlariKontrolEt(ml, s1);
			menuUret(ml);
			s1.pizzayaGeriEkle();
			if(sucukluToplam>0){
				sucukluToplam-=1;
				}
		}
		Mantar m1=new Mantar(ml);
		if(m1.malzemeYetiyormu()){
			if(m1.pizzaYap()){
				mantarliToplam+=1;
			}
			durumlariKontrolEt(ml, m1);
			menuUret(ml);
			m1.pizzayaGeriEkle();
			if(mantarliToplam>0){
				mantarliToplam-=1;
			}
		}
		AciliVejeteryan ac1=new AciliVejeteryan(ml);
		if(ac1.malzemeYetiyormu()){
			if(ac1.pizzaYap()){
				aciliVejeteryanToplam+=1;
			}
			durumlariKontrolEt(ml, ac1);
			menuUret(ml);
			ac1.pizzayaGeriEkle();
			if(aciliVejeteryanToplam>0){
				aciliVejeteryanToplam-=1;
			}
		}
	}
	private void durumlariKontrolEt(MalzemeListesi ml, Pizza p) {
//MenuyeOzguFiyat*menuMalzemeIsmi ile toplam satisi hesapliyor
		toplamSatis=vejeteryanToplam*50+sucukluToplam*100+
		        mantarliToplam*90+aciliVejeteryanToplam*75;
//Toplam satis parasindan kalan malzemeleri cikartiyor.Cunku kalan malzemeden yeni menu
//olusturulmadigina gore cope gidiyor artan miktarlar.Yani zarar olarak hesapliyor.
		toplamKarimiz=toplamSatis-p.kalanMalzeme();
//Baslangicta enkarli duruma sifir veriyor.Sonraki bulunnan kar bu degerden buyukse
//yani daha karli ise o durumun degerlerini aliyoruz.Yani simdiye kadarki en karli durumu bulmus oluyoruz.
//Bu sekilde program bittikten sonra tum durumlarin en karlisi bulunur.Gostermek icin de ekrana yaziyorum.
		if(enKarliDurum<toplamKarimiz){
			enKarliDurum=toplamKarimiz;
			vejeteryanSon=vejeteryanToplam;
			sucukSon=sucukluToplam;
			mantarSon=mantarliToplam;
			aciSon=aciliVejeteryanToplam;
			zarar=p.kalanMalzeme();
			satisFiyati=toplamSatis;
//Bulunan en karli durumu yazdiriyorum.Arama sonunda elimizde en karli durum olur.Ilk durum sifir atadim
//sonraki durumlarla karsilastir daha karli ise o ana kadar ki en karli durumu bulmus oluyoruz.
			ml.sonDurumuYazdir();
			System.out.println("Toplam satis--> "+satisFiyati+"\nZarar: "+zarar);
System.out.println("V:"+vejeteryanSon+"\tS:"+sucukSon+"\tM:"+mantarSon+"\tAc:"+aciSon+
		"\tAdetle yapilan kar->"+enKarliDurum+"\n");
		}
//Karli olma ihtimali dusuk degerleri yazdirmiyorum.Cunku yazma islemi icin baya zaman gidiyor
	}
}

Ana Sınıf
Vejeteryan.java

package Pizza;
import ethemsulan.com.MalzemeListesi;
public class Vejeteryan extends Pizza
{
	public Vejeteryan(MalzemeListesi ml)
	{
		this.ml = ml;
//Vejeteryanli icin kullanilan malzeme miktarlari
		gerekliMalzeme.put("Sogan", 350);
		gerekliMalzeme.put("Mantar", 275);
		gerekliMalzeme.put("Biber", 200);
		gerekliMalzeme.put("Aci", 50);

		satisFiyati = 50;
	}
}

Ana Sınıf
Sucuklu.java

package Pizza;
import ethemsulan.com.MalzemeListesi;

public class Sucuklu extends Pizza
{
	public Sucuklu(MalzemeListesi ml)
	{
		this.ml = ml;
//Sucuklu icin kullanilan malzeme miktarlari
		gerekliMalzeme.put("Sogan", 150);
		gerekliMalzeme.put("Biber", 200);
		gerekliMalzeme.put("Aci", 50);
		gerekliMalzeme.put("Sucuk", 250);

		satisFiyati = 100;
	}
}

Ana Sınıf
Mantar.java

package Pizza;
import ethemsulan.com.MalzemeListesi;

public class Mantar extends Pizza
{
	public Mantar(MalzemeListesi ml)
	{
		this.ml = ml;
//Mantarli icin kullanilan malzeme miktarlari
		gerekliMalzeme.put("Sogan", 100);
		gerekliMalzeme.put("Mantar", 300);
		gerekliMalzeme.put("Biber", 300);
		gerekliMalzeme.put("Peynir", 250);

		satisFiyati = 90;
	}
}

Ana Sınıf
AciliVejeteryan.java

package Pizza;
import ethemsulan.com.MalzemeListesi;
public class AciliVejeteryan extends Pizza
{
	public AciliVejeteryan(MalzemeListesi ml)
	{
		this.ml = ml;
//Acili vejeteryan  icin kullanilan malzeme miktarlari
		gerekliMalzeme.put("Sogan", 300);
		gerekliMalzeme.put("Peynir", 250);
		gerekliMalzeme.put("Mantar", 150);
		gerekliMalzeme.put("Biber", 250);
		gerekliMalzeme.put("Aci", 300);
//Bir menu fiyati
		satisFiyati = 75;
	}
}

Ana Sınıf

Uygulamanın kodlarını dropboxdan indirmek için tıklayın
Sınıf diagramları büyük
uml
Soyut olarak ağaç oluşturma:
caslimamantigi
En son çıktı en karlı durumdur:
ciktisonuc
Test.java

package ethemsulan.com;

public class Test
{

	public static void main(String[] args)
	{
//Baslangic degerleri,fiyat ve malzeme isimleri
		Malzeme sogan = new Malzeme("Sogan", 3000, 5);
		Malzeme peynir = new Malzeme("Peynir", 1000, 15);
		Malzeme mantar = new Malzeme("Mantar", 2000, 20);
		Malzeme biber = new Malzeme("Biber", 3000, 10);
		Malzeme aci = new Malzeme("Aci", 1000, 25);
		Malzeme sucuk = new Malzeme("Sucuk", 1000, 30);
		MalzemeListesi ml = new MalzemeListesi();
		ml.addMalzeme( sogan );
		ml.addMalzeme( peynir );
		ml.addMalzeme( mantar );
		ml.addMalzeme( biber );
		ml.addMalzeme( aci );
		ml.addMalzeme( sucuk );
//Recursive olarak cagri yapiyoruz.Sanki node olusturuyormus gibi
		MenuUretRecursive menuNes=new MenuUretRecursive();
//Baslangic durumda toplam malzemeleri basar.Eger // kaldirisaniz
		menuNes.menuUret(ml);
	}
}

Diğer kodların linkleri aşağıdadır:
Uygulamanın Raporu
MenuUretRecursive.java
MalzemeListesi.java
Malzeme.java
Pizza.java(abstract)
Vejeteryan.java
Sucuklu.java
Mantar.java
AciliVejeteryan.java

package ethemsulan.com;
public class AsalsayiTopla {

	public static int asalTopla(int n)
	{
//metod kendi kendini cagirdiginda kontrol=0 yap
		int kontrol = 0;
		if(n<1){
			return 0;
		}
//Asal sayi sadece kendisine ve 1 tam bolunebilen sayilardir.
//Sayinin yarisi kadar kontrol ediyor.Bu aralikta sadece 1 e bolunmesi gerekir
//Eger sayi kendisinin yarisina kadar kontrol edip sadece 1 e bolunuyorsa o zaman
//kontrolu 1 arttiriyorum. n/2 dikkat.yarisina kadar kontrol etme yeterli
		for(int i=1;i<=n/2;i++){
			if(n%i==0){
				kontrol++;
			}
		}
//kontrol==1 ise sayimiz asaldir.Asal ise n+metod(bir sonraki sayi)
		if(kontrol==1){
			System.out.println("Asal sayi:"+n);
			return n+asalTopla(n-1);
		}
//Sart saglamiyorsa yani asal degilse bir sonraki sayiyi cagir
		return asalTopla(n-1);
	}
	public static void main(String[] args) {
		System.out.println(1+" den "+30+" kadar olan asal sayilarin toplami-->"+AsalsayiTopla.asalTopla(30));
	}
}

orjinal kod

package ethemsulan.com;
public class RecursiveMetod {
//sayıların toplamını alan recusive metod
	 public static int topla(int n){
	  if(n<1)
	  {
	   return 0;
	   }
	  else
	  {
		   return n+topla(n-1);
	    }
	  }
public static void main(String[] args) {
	 System.out.println(topla(100));
	 }
}
package ethemsulan.com;
public class UsAlmaRecursive {
//Eger 1 den kucukse 1 donder yani metodu sonlandir.
//Degilse taban*bir sonraki cagirimdaki taban
	 public static int usAl(int taban,int us){
	  if(us<1)
	  {
	   return 1;
	   }
	  else
	   {
		   return usAl(taban,us-1)*taban;
	    }
	  }
	 public static void main(String[] args) {
	         System.out.println(usAl(4,3));
	 }
}

Tree
Dugum bir nesnedir.Kendi degerini ve sag ve sol degerleri tutuyor
AnaSinif.java

package ethemsulan.com;
public class AnaSinif {
    public static void main(String[] args) {
//Nesne olusturup teker teker dugum ekleniyor ve sonrada sirayla yaziliyor
    AgacOlustur agacNesne= new AgacOlustur();
    agacNesne.rootOlustur(55);
    agacNesne.rootOlustur(21);
    agacNesne.rootOlustur(17);
    agacNesne.rootOlustur(111);
    agacNesne.rootOlustur(33);
    agacNesne.rootOlustur(27);
    agacNesne.rootOlustur(8);
    agacNesne.rootOlustur(34);
    agacNesne.rootOlustur(22);
    agacNesne.siraylaYaz(agacNesne.getKokDugum());
    }
}

Orjinal kod
NodeOlustur.java

package ethemsulan.com;
public class NodeOlustur {
//Bir sonraki nodlari tutmayi saglar.
//Bu nesne yani dugum olusturuldugu yerde sag-sol ve ve value
//degerleri kendi icinde barindirir.
    private int deger;
    private NodeOlustur sag;
    private NodeOlustur sol;

    public int getDeger() {
        return deger;
    }
    public void setDeger(int deger) {
        this.deger = deger;
    }
    public NodeOlustur getSag() {
        return sag;
    }
    public void setSag(NodeOlustur sag) {
        this.sag = sag;
    }
    public NodeOlustur getSol() {
        return sol;
    }
    public void setSol(NodeOlustur sol) {
        this.sol = sol;
    }
}

Orjinal kod
AgacOlustur.java

package ethemsulan.com;
public class AgacOlustur {
//baslangicta kokDugum yani ana dugum yoksa olusturulur
    private NodeOlustur kokDugum;

    public NodeOlustur getKokDugum() {
        return kokDugum;
    }

    public void setKokDugum(NodeOlustur kokDugum) {
        this.kokDugum = kokDugum;
    }
//kokDugum(yoksa) olusturulduktan sonra roota bagli yapraklar olusturan metod cagrilir.
public void rootOlustur(int sayi)
{
    if(kokDugum == null)
    {
        kokDugum = new NodeOlustur();
        kokDugum.setDeger(sayi);
    }
    yaprakOlustur(kokDugum,sayi);
}
public void yaprakOlustur (NodeOlustur ust,int sayi)
{
//degeri ana dugumdeki degerden buyukse sagda yeni node olusturulur
    if (sayi>ust.getDeger())
    {

        if(ust.getSag()== null)
        {
            ust.setSag(new NodeOlustur());
            ust.getSag().setDeger(sayi);
            System.out.println(ust.getDeger()+"-->sagındaki deger-->" +ust.getSag().getDeger());
        }
//dugum olusturan metodu tekrar cagirir.
        yaprakOlustur(ust.getSag(),sayi);
    }
//degeri ana dugumdekiki degerden kucukse solda dugum olustur
     if (sayi<ust.getDeger())
    {
        if(ust.getSol()== null)
        {
//dugum yoksa olustur degeri ekle ve ekrana yaz
            ust.setSol(new NodeOlustur());
            ust.getSol().setDeger(sayi);
            System.out.println(ust.getDeger()+"-->solundaki deger-->" +ust.getSol().getDeger());
        }
//metodu tekrar cagir
        yaprakOlustur(ust.getSol(),sayi);
    }
}
//Degerleri sirayla(kucukten-buyuge) ekrana yazar
public void siraylaYaz (NodeOlustur ust)
{
//sag yapraga yani sona ulasmayana kadar agaci tara ve once sol sonra da sag degeri yaz
    if (ust != null)
    {
        siraylaYaz(ust.getSol());
        System.out.print(ust.getDeger());
        siraylaYaz(ust.getSag());
    }
    System.out.println();
}
}

Orjinal kod