Τρίτη 21 Μαρτίου 2017

Fibonacci Παράδειγμα.

Το πρόγραμμα δείχνει διάφορους τρόπους που βγαίνει η ακολουθία Fibonacci.
Παλαιότερα είχα δώσει ένα μικρό απλό πρόγραμμα, όπου το δείχνω μαζεμένο εδώ:


a=0 : b=1
fibonacci(20)
sub fibonacci(x)
if X>1 then fibonacci(X-1)
Print a, x : swap a, b :b+=a:x++
end sub


Υπάρχει και νεότερη εκδοχή ως παράδειγμα δυναμικού προγραμματισμού εδώ


Υπάρχει τρόπος με απλή επανάληψη και χρήση δυο μεταβλητών, ο τρόπος να μας δίνει μια συνάρτηση λάμδα τις επόμενες τιμές σε κάθε εκτέλεση, και τρόποι με αναδρομή.
Στη λάμδα συνάρτηση δεν έχουμε όνομα να καλέσουμε, και καλούμε με το γενικό όνομα λάμδα() ή για επιστροφή αλφαριθμητικού την λάμδα$(). Μετά ακολουθεί η fib() όπου εκεί καλούμε με το όνομα fib() μέσα από την fib()
Τέλος έχουμε μια υπορουτίνα, όπου και αυτή έχει δυνατότητα αναδρομής αλλά εδώ κάνουμε το εξής αφήνουμε αποτελέσματα στο σωρό και παίρνουμε από εκεί. Δηλαδή χρησιμοποιούμε μια τοπική  μεταβλητή τη χ και το σωρό τιμών (με Push βάζουμε στη κορυφή, με Διάβασε τη σηκώνουμε, αλλά εδώ χρησιμοποιώ την Αριθμός/Number και με μια Push Number+Number, τραβάμε τα δυο πρώτα τα προσθέτουμε και βάζουμε το αποτέλεσμα στη κορυφή του σωρού)

Recursion.limit  \\ just infrorm about the limits
\\ limit for function can't be change from program
\\ we can change limit for subs


\\ A loop in a function
Fibonacci=lambda (x)-> {
      Let A=0, B=1
      If x<=1 then =0 : exit
      For i=1 to x-1 {
            Push B : B=A+B: Read A
      }
      =A
}
\\ Same as before but without loop
\\ Also lambda capture A and B
FibonacciNext=lambda A=0, B=1-> {
      =A
      Push B : B=A+B: Read A
}
Print Fibonacci(5)
\\ A is a copy lambda with A and B zero
A=FibonacciNext
For I=1 to 10 { Print A(), } \\ print using columns
Print   \\ new line


\\ Recursion  (max 3375 level of recursion)
FibonacciRecursion=lambda (x) ->{
            if x<=1 then =0 : exit
            if x=2 then =1 : exit
            =lambda(x-1)+lambda(x-2)
}
Print FibonacciRecursion(5), Fibonacci(5)
Print FibonacciRecursion(10), Fibonacci(10)
Function Fib (x) {
      if x<=1 then =0 : exit
      if x=2 then =1 : exit
      =Fib(x-1)+Fib(x-2)
}
Print Fib(15),FibonacciRecursion(15), Fibonacci(15)
Print "Press a key"
A$=Key$
S=stack.size
FibonacciSub(15)
Print Number \\ pop value from stack


\\ sub with recursion, using M2000 stack for values/Parameters
\\ If we don't call subs between blocks of code in brackets { } then
\\ we get high recursion depth level
Rem : Recursion.Limit 500000
Sub FibonacciSub(x)
      if x<=1 then Push 0: Exit Sub
      if x=2 then Push 1: Exit Sub
      FibonacciSub(x-1)
      FibonacciSub(x-2)
      Push Number+Number \\ Number is pop
      \\ Unhide Stack to see stack values
      \\ Stack size as a bar graph
      Print String$("*",stack.size-S)
End Sub


Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.