Solved

Fibonacci challenge

Posted on 2016-09-09
11
110 Views
Last Modified: 2016-09-11
Hi,

I am working on below challenge
http://codingbat.com/prob/p120015

Psedo code:
1. if first two numbers return same
2. else call same fibonacci method by passing n-1 and n-2 and sum it up

public int fibonacci(int n) {
  
   if ((n == 0) || (n == 1)) // base cases
      return n;
    else
      // recursion step
      return fibonacci(n - 1) + fibonacci(n - 2);
  

}

Open in new window




I am passing all tests
Expected      Run            
fibonacci(0) → 0      0      OK      
fibonacci(1) → 1      1      OK      
fibonacci(2) → 1      1      OK      
fibonacci(3) → 2      2      OK      
fibonacci(4) → 3      3      OK      
fibonacci(5) → 5      5      OK      
fibonacci(6) → 8      8      OK      
fibonacci(7) → 13      13      OK      
other tests
OK      

How to improve/modify my design, code and any other alternate approaches. please advise
0
Comment
Question by:gudii9
  • 3
  • 2
  • 2
  • +4
11 Comments
 
LVL 35

Assisted Solution

by:mccarl
mccarl earned 50 total points
ID: 41792555
No improvement necessary, that's about as simple as it gets!
0
 
LVL 15

Accepted Solution

by:
gurpsbassi earned 250 total points
ID: 41792556
You could get rid of the extra brackets
1
 
LVL 33

Assisted Solution

by:ste5an
ste5an earned 50 total points
ID: 41792630
This again: These tests and tasks are pretty poor. Fibonacci is definied here over N0. Thus a test covering the input -1 should exist. And you should test the input first.
1
 
LVL 26

Assisted Solution

by:dpearson
dpearson earned 50 total points
ID: 41792714
No changes needed - you've nailed this one.

Doug
0
 
LVL 28

Assisted Solution

by:pepr
pepr earned 50 total points
ID: 41792752
I agree with ste5an. On the other hand, this is for learning the basics of programming, and the totally correct solution (with checking of everything, with unit test, and so on) is not necessary to understand the principle (of Fibonacci, and of the recursive solution).

What is important in this case is that you should not remember this recursive solution as the right approach. The reason is that it is extremely ineficient. The non-recursive solution is not more difficult here, and it is much more efficient.
0
3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

 
LVL 32

Assisted Solution

by:phoffric
phoffric earned 50 total points
ID: 41792832
More advanced ways to compute fibonacci(n) really fast - no recursion, and no loops to get to the nth case.
http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibformproof.html

The way I learned the closed form solution was to take the z-transform of the equation. Here is a link that describes how to do this.
http://mathforum.org/library/drmath/view/51540.html
The difference equation for the Fibonacci series is:
    u(n+2) = u(n+1) + u(n)   with   u(0) = 0,  u(1) = 1
So:

    u(n+2) - u(n+1) - u(n) = 0  

Taking the z-transforms:

    z^2[u(z) - u(0) - u(1)/z] - z[u(z) - u(0)] - u(z) = 0

    u(z)[z^2 - z - 1] - z^2*u(0) - z*u(1) + z*u(0) = 0

Putting u(0) = 0 and u(1) = 1 this becomes:

    u(z)[z^2 - z - 1] =  z

                 z
    u(z) =  -------------
             z^2 - z - 1

The denominator factorizes to:

    [z-1/2 -sqrt(5)/2)][z-1/2 +sqrt(5)/2]

The trick here is to express u(z)/z in partial fractions:

                                1                     1
    u(z)/z =   1/sqrt(5)[ ----------------   - ---------------- ]
                         z-1/2 - sqrt(5)/2     z-1/2 +sqrt(5)/2

and so: 

                            z                     z
    u(z) = 1/sqrt(5)[----------------  - ------------------ ]
                     z-1/2-sqrt(5)/2)      z-1/2+sqrt(5)/2

Then from table of inverse transforms:

       z
    -------  =  a^n    
     z - a

where a is constant. Then:

                              z                       z
    u(z) = 1/sqrt(5) [-------------------- - --------------------]
                       z - (1/2+sqrt(5)/2)    z - (1/2-sqrt(5)/2)

Now from the table of inverse transforms:
    u(n) = 1/sqrt(5)[(1/2+sqrt(5)/2)^n - (1/2-sqrt(5)/2)^n]

Open in new window

2
 
LVL 32

Expert Comment

by:phoffric
ID: 41792846
Here's a graph of the continuous function (i.e., let n be a continuous real positive number) that I asked wolframalpha to plot.
 u(n) = [(1/2+sqrt(5)/2)^n - (1/2-sqrt(5)/2)^n]/sqrt(5)

Open in new window

fib.pnghttp://www.wolframalpha.com/input/?i=plot+%5B(1%2F2%2Bsqrt(5)%2F2)%5En+-+(1%2F2-sqrt(5)%2F2)%5En%5D%2Fsqrt(5),+where+n+%3D+1+to+8

When n is a positive integer, then u(n) is also a positive integer. Pretty amazing!
In practice, when computing, you probably won't get a positive integer, but a real number that is very close. To get the positive integer, you need to use a round function.
http://www.tutorialspoint.com/java/number_round.htm
1
 
LVL 32

Expert Comment

by:phoffric
ID: 41792858
As n gets larger, the speed at which you compute fibonacci(n) really rocks over the other approaches, whether recursive or just looping. However, if you want a table of the first N values of fibonacci(n), then just adding the previous two integers and storing it into an array of length N will be faster than using fibonacci(n) for all values of n = 1..N, where n is an integer.
1
 
LVL 7

Author Comment

by:gudii9
ID: 41793631
public int fibonacci(int n) {
  
   if ( n == 0 || n == 1) // base cases
      return n;
    else
      // recursion step
      return fibonacci(n - 1) + fibonacci(n - 2);
  

}

Open in new window


got rid of extra brackets. when i have to put and when i can get rid of brackets?
0
 
LVL 35

Expert Comment

by:mccarl
ID: 41793635
They make absolutely NO difference (in this case) to the execution of the code, if it is easy for you to read with them there, leave them there. That's all that it comes down to, how easy it is to read for YOU.
0
 
LVL 26

Expert Comment

by:dpearson
ID: 41793704
Yes +1 for what mccarl said - I actually think it's a little better with the extra brackets.  You should always prefer clarity and to me the extra with the extra braces is clearer.

Doug
0

Featured Post

3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Displaying an arrayList in a listView using the default adapter is rarely the best solution. To get full control of your display data, and to be able to refresh it after editing, requires the use of a custom adapter.
If you’re thinking to yourself “That description sounds a lot like two people doing the work that one could accomplish,” you’re not alone.
This theoretical tutorial explains exceptions, reasons for exceptions, different categories of exception and exception hierarchy.
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…

920 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now