Minggu, 24 April 2011

REKURSIF


Contoh  Program rekursif pada deret :  1 - (1/2) + (1/3) + .... + (1/n)

#include <iostream.h>
#include <conio.h>

class hitung
{
public:
int proses();
void input();
private:
int n;
float rumus,jumlah,total;
};

void hitung::input()
{
cin>>n;
cout<<endl;
}

int hitung::proses()
{
jumlah=0;
total=0;
rumus=-1;

for(int j=1; j<=n; j++)
{
rumus=(rumus*(-1));
total=rumus/j;
jumlah+=total;
if(j==1)
cout<<"("<<total<<")";
if(j>1)
cout<<"+("<<total<<")";
}
cout<<endl<<endl<<"hasil penjumlahan deret = "<<jumlah;
return jumlah;
}

int main()
{
cout<<"program sederhana menghitung jumlah dari rumus 1-(1/2)+(1/3)-(1/4)+...+(1/n)"<<endl<<endl;
cout<<"tentukan nilai n : ";
hitung deret;
deret.input();
deret.proses();
getch();

return 0;
}

output :
Pseudo code :
Iteratif.

rumus : 1
total : 1/3
jumlah : 1/2 + 1/3
n = 3
hasil = 0
for i <-- 1 to n do 
if ( i mod 2 = 0)
hasil = hasil - (1/i)
else
end if 
end for



Kamis, 21 April 2011

FIBONACCI

Berikut adalah contoh program untuk menentukan bilangan fibonnaci (c++).


#include<iostream>
using namespace std;
int fibonacci(int n)
{
if(n==1)
return(0);
else if(n==2)
return(1);
else
return (fibonacci(n-1)+fibonacci(n-2));
}

int main()
{
int n;
cout<<"\nBerapa jumlah bilangan fibonacci yang ingin anda tampilkan: ";cin>>n;
for(int i=1;i<=n;i++)
cout<<fibonacci(i)<<" ";
cout<<endl;
}
 




Penjelasan:
Program sederhana diatas menggunakan fungsi rekursif untuk menampilkan bilangan fibonacci.
Baris pertama dan kedua adalah statements yang paling sering kita tuliskan. Yang pertama untuk mengikutsertakan library iostream "#include<iostream>". Baris yang kedua adalah untuk menggunakan namespace std. Untuk lebih jelasnya, silahkan cari dengan mbah google dengan keywords c++, namespace,  std, preprocessor.

Di baris ke 3 sampai 11 terletak implementasi dari algoritma bilangan fibonacci. Pada baris ini kita definisikan fungsi dengan nama "fibonacci" yang memiliki return value integer dan parameter (int n). Contoh bilangan fibonacci adalah:
0, 1, 1, 2, 3, 5, 8... (bilangan berikutnya adalah penjumlahan dari 2 bilangan sebelumnya) 

int fibonacci(int n)
{
if(n==1)
return(0);
else if(n==2)
return(1);
else
return (fibonacci(n-1)+fibonacci(n-2));
}



Pada fungsi diatas kita menggunakan pemeriksaan beruntun dengan "if statement".
Jika n adalah 1, maka return valuenya adalah bilangan pertama fibonacci (0).
Jika n adalah 2, maka return valuenya adalah bilangan kedua finonacci (1).
Bilangan pertama dan kedua harus ditentukan agar algoritma ini berjalan.
Jika bukan bilangan pertama atau bilangan kedua, maka return valuenya adalah penjumlahan fungsi rekursif fibonacci dengan parameter bilangan sebelumnya dan bilangan sebelum-sebelumnya ( n-1 dan n-2).


CONTOH PROGRAM LAIN

Berikut ini koding yang dapat digunakan untuk membuat program fibonacci dalam c++ :

#include <iostream.h>
#include<conio.h>
main()
{
int x=1,y=1,p,i,a;
clrscr();
cout<<"Masukkan batas deret fibonacci : ";
cin>>a;
cout<<x<<" ";
cout<<y<<" ";
for(i=0;i<=a-3;i++)
{
p=x+y;
cout<<p<<" ";
x=y;
y=p;
}
getch();
return 0;
}
^_^









Penjelasan:
barisan ini berawal dari 0 dan 1, kemudian angka berikutnya didapat dengan cara menambahkan kedua bilangan yang berurutan sebelumnya. Dengan aturan ini, maka barisan bilangan Fibonaccci yang pertama adalah:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946...
Barisan bilangan Fibonacci dapat dinyatakan sebagai berikut: Fn = (x1^n - x2^n)/ sqrt(5) dengan
  • Fn adalah bilangan Fibonacci ke-n
  • x1 dan x2 adalah penyelesaian persamaan x^2-x-1=0
Perbandingan antara Fn+1 dengan Fn hampir selalu sama untuk sebarang nilai n dan mulai nilai n tertentu, perbandingan ini nilainya tetap. Perbandingan itu disebut Golden Ratio yang nilainya mendekati 1,618.








FIBONACI

Program fibonaci dengan jeliot.


import jeliot.io.*;

/* IterFibonacci calculates the first */
/* n fibonacci numbers. N is supplied */
/* by the user.                          */

class IterFibonacci {
    static void main() {

        int a = 1;
        int b = 0;
        int tmp;
        int i = 0;
        int n = Input.readInt();
      
        while (i < n) {
            tmp = a;
            a = a + b;
            b = tmp;
            i = i + 1;
            Output.println(a);
        }
    }
}






Pada algoritma fibonacci rekursif dan fibonacci non-rekursif, kita tahu bagaimana merumuskan deret bilangan fibonacci dengan algoritma logika yang kita miliki. Sekarang akan dibahas pnerapan algoritma tersebut ke dalam programming java. Pertama mari kita lihat source code java untuk deret bilangan fibonnaci rekursif. Source codenya seperti di bawah ini :
01/**
02 *
03 * @author Goes Redy
04 */
05public class Fibonacci {
06    public static int fibbon(int x){
07        if (x<=0 || x<=1){
08            return x;
09        }
10        else{
11            return fibbon(x-2)+fibbon(x-1);
12        }
13    }
14    public static void main(String[]args){
15        int n=10;
16        for (int i=0;i<n;i++){
17            System.out.print(fibbon(i)+" ");
18        }
19    }
20}
Code di atas mengeluarkan nilai dari setiap alamatnya pada array. Jika for pada code java di atas dihilangkan, maka kita akan mendapatkan satu nilai saja dari setiap alamat yang kita ketikkan pada pemanggilan rekursifnya. Jadi for tersebut diperlukan agar bilangan fibonacci tersebut dikeluarkan dari bilangan pertama sampai ke deret yang kita inginkan secara berurutan.
Kedua, mari kita bahas untuk algoritma yang non-rekursif. Cara ini relatif lebih baik, karena penggunaan memorynya jauh sekali lebih hemat untuk penggunaan data yang banyak. Sedikit memory tentunya jauh lebih cepat. Contoh sourcodenya adalah seperti di bawah ini :
01/**
02 *
03 * @author Goes Redy
04 */
05public class Fibonacci {
06    public static void main(String[]args){
07    int a=0,b=1;
08    int n = 10// input deret fibonacci
09    for (int i=1;i<=n;i++){
10      System.out.print(a+" ");
11      a=a+b;
12      b=a-b;
13    }
14  }
15}
Bisa langsung dilihat pada sourcecode tersebut hampir sama dengan algoritmanya. Algoritmanya bisa dibilang sangat efektif karena menghabiskan source sesuai kebutuhannya, jadi bisa dibilang efesien bukan.






Barisan Fibonacci adalah barisan yang didifinisikan secara rekursif. Barisan fibonacci yang bertama adalah :
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946…
sumber : Bilangan Fibonacci 
jadi algoritmanya adalah bilangan di awali dari 0 dan 1 dan bilangan selanjutnya merupakan penambahan bilangan sebelumnya dengan yang sebelumnya lagi.
dan dibawah ini saya mencoba membuat sourcode dari algoritma fibonacci menggunakan java programming.
Program :
import javax.swing.JOptionPane;

public class Fibonacci {
    public static void main(String[] args) {
        int deret=Integer.parseInt(JOptionPane.showInputDialog("Masukkan berapa deret Fibonacci: "));
        int a=0;
        int b=1;
        System.out.print(deret+" deret Fibonacci: " );
        for (int i=0;i<deret;i++){
            System.out.print(a+" ");
            a=a+b;
            b=a-b;
        }
    }
}
sourcecode diatas kalo di run hasilnya seperti dibawah ini, contoh saya tampilkan 9 deret bilangan fibonacci.
fibo
sourcecode diatas masih bisa dikembangkan lagi, yaitu variable a dan b menggunakan inputan/masukan dari keyboard karena fibonacci tidak hanya untuk angka 0 dan 1 saja, tapi untuk yg lain juga bisa.. misal 3 dan 7, dsb…


Program :
public class Fibonacci {
public static void main (String [] args) {
int x = Integer.parseInt(args[0]);
int i, temp01, temp02, hasil;
temp01=0;
temp02=1;
hasil=0;
for(i=1; i<=x; i++){
temp01=temp02;
temp02=hasil;
System.out.print(hasil+" ");
hasil=temp01+temp02;
}
}
}



Penjelasan : Pada contoh gambar di atas saya memasukan inputan 10,sehingga akan melakukan perulangan sebanyak 10 kali. Saat perulangan pertama dilakukan, nilai temp02 akan dimasukan ke temp01 dan nilai variable hasil akan dimasukan ke temp02. Pada saat perulangan pertama dilakukan  nilai variable hasil masih bernilai nol lalu di outputkan ke layar, setelah itu nilai temp01 akan dijumlahkan dengan nilai temp02 dan akan dimasukan ke dalam variabel hasil. Proses tersebut akan terus dilakukan sampai proses perulangan selesai.