'Python fibonacci series

I wrote a Fibonacci series using Python. Could not figure out why second program is giving wrong answer and first one right when both look same.

Below program gives right answer

def fib(n):
  a,b=0,1
  while b<n:
    print b
    a,b=b,a+b

fib(4)
1
1
2
3

Below program gives wrong answer:

def fib(n):
  a = 0
  b = 1
  while b<n:
    print b
    a = b
    b = a+b

fib(4)

1
2


Solution 1:[1]

In first one, a, b = b, a+b does the assigning simultanously.
In second one, you are first doing a = b and then doing b = a+b which actually is just b = 2*b.

How to achieve such behaviour in second one? Use temporary value to store a.

def fib(n):
  a = 0
  b = 1
  while b<n:
    print b 
    temp = a
    a = b
    b = temp+b
fib(4)

>>>1
>>>1
>>>2
>>>3

Solution 2:[2]

In the second code posted, you redefine the value of b after having changed a, resulting as

def fib(n):
  a = 0
  b = 1
while b<n:
  print b     #prints 1
  a = b       #a = 1
  b = a+b     #b = 1 + 1 = 2

In the second code, there is no problem, as python code generally reads equations from right to left, thus redefines b first, as is correct

def fib(n):
    a,b=0,1    #a = 0, b = 1
while b<n:
    print b
    a,b=b,a+b  #b = 0 + 1 = 1, #a = 1

Solution 3:[3]

fibonacci series using lambda function in python

n = int(input("Enter the range of numbers in fibonacci series:"))
F = [0,1]
list(map(lambda i: F.append(F[i-1] + F[i-2]), range(2, n)))
print(F)

Solution 4:[4]

fibonacci series using List Comprehension function in python

n = int(input("Enter the range of numbers in fibonacci series:"))
F = [0,1]
[F.append(F[i-1] + F[i-2]) for i in range(2,n)]
print(F)

Solution 5:[5]

In the first example, you've used this code:

a,b=b,a+b

While in the second, you've done this instead:

a = b
b = a+b

These are not the same thing.

For the sake of argument, let's say that a = 3 and b = 6. Let's run the working code first:

>>> a, b = 10, a + 1
>>> a
10
>>> b
4

The value of a + 1 is 4 rather than 11, because b's assignment is using the old value of a, so 3 + 1 == 4.

Now let's put a and b back to their starting values. Let's try the other method of assigning:

>>> a = 10
>>> b = a + 1
>>> a
10
>>> b
11

Now b is 11! That's because a was assigned before the assignment of b, so the addition uses a's new value.

The reason your second version isn't working is because the assignments don't happen simultaneously, so b is actually 2 * b because a has already been set to b by the time a+b is executed.

Solution 6:[6]

def fibonacci (n):
    if n == 1 or n == 2:
        return 1
    return fibonacci (n-1) + fibonacci (n-2)

for i in range(1,50):
    print (fibonacci(i))

Solution 7:[7]

n1 = 0
n2 = 1
c = 0

nTerms = int(input())

if nTerms <= 0:
    print("Enter the valid value")
elif nTerms == 1:
    print(a)
else:
    while c < nTerms:
        print(n1)
        nth = n1 + n2
        n1 = n2
        n2 = nth
        c += 1

Solution 8:[8]

Fibonacci Series Using Recursion

def f_recursion(n):
    if n <= 1:
        return n
    else:
        return(f_recursion(n-1) + f_recursion(n-2))
# Driver Code
nterms = int(input())
if nterms <= 0:
    print("Enter the positive value")
else:
    for i in range(0,nterms):
        print (f_recursion(i))

Solution 9:[9]

n1=int(input("Enter Term"))
mylist=[0,1]
for a in range(n1):
    sum=0
    for b in mylist[len(mylist)-2:]:
        sum+=b
    mylist.append(sum)
print(mylist)

Solution 10:[10]

def fib(n):
    a=0
    b=1
    sum=0
    for i in range(0,n):
        print(sum)
        sum = a + b 
        b = a
        a = sum
fib(10) // here you can add any n value from 1 to 100 

Solution 11:[11]

# The below code will generate the fibonacci series as per desired range
# just put the number, you want the fibonaci series upto.

def fibonacci(num):
    x,y = 0,1
    if num==1:
        print(x)
    elif num==2:
        print(x,y)
    else:
        print(x,y,end = " ")
        for i in range(num-2):
            z=x+y
            x=y
            y=z
            print(z,end = " ")

Solution 12:[12]

def fib(n1, n2):
    print(n1)
    print(n2)
    for i in range(n1, n2):
        n1 += n2
        n2 += n1
        print(n1)
        print(n2)

starting_number = int(input('Enter First Term: '))
ending_number = int(input('Enter Second Number: '))
fib(starting_number, ending_number)