递归不会在Python中终止

时间:2017-01-30 01:12:50

标签: python recursion

我试图编写一个程序来查找给定的数字是否在Fibonacci序列中,并且我不断得到不会终止的递归,而且我不确定原因。 17号线似乎是个大问题。当我输入0或1时,我得到了所需的答案。只是寻求帮助得到答案,我试着学习,只是告诉我答案对我没什么帮助。

number = int(input("Enter your number:"))

def fib(n):
        if n == 0 or n == 1:
            return 1
        else:
            return (fib(n-1) + fib(n-2))
def isfib(number):
        n = 0
        if number < 0:
            print("Invalid input")
        elif number == fib(n):
            print("Number is in the sequence")
        elif number < fib(n):
            print("Number is not in the sequence")
        elif number > fib(n):
            n = n +1
            isfib(number) #where the problem occurs
isfib(number)

5 个答案:

答案 0 :(得分:1)

有很多小错误,所以我纠正了这些错误(我已经添加了一个更简单的添加更好的Fibonacci代码实现):

number = int(input("Enter your number:"))

def fib(n): 
 if n == 0 or n == 1: return 1
 else:
  temp1=1
  temp=2
  temp3=0
  for z in range(n-2):
   temp3=temp
   temp+=temp1
   temp1=temp3
  return temp

def isfib(number): #it is ok not to return anything unless you need to stop the function in between
 done=0
 n=0
 while done!=1:
  if number < 0:
   print("Invalid input")
   done=1
  elif number == fib(n):
   print("Number is in the sequence")
   done=1
  elif number < fib(n):
   print("Number is not in the sequence")
   done=1
  elif number > fib(n):
   n = n +1
#i have used done instead of return to show the function can exit even if you dont return a value
#you can just 'return' instead of changing done variable and making the loop infinite
isfib(number)

由于你已经使用了很多递归,我猜你只想通过使用递归来做到这一点。所以,代码将是这样的: number = int(输入(“输入你的号码:”))

def fib(n):
 if n == 0 or n == 1: return 1
 else: return (fib(n-1) + fib(n-2))
def isfib(number,n=0):
 if number < 0: print("Invalid input")
 elif number == fib(n): print("Number is in the sequence")
 elif number < fib(n): print("Number is not in the sequence")
 elif number > fib(n):
  n = n +1
  isfib(number,n)
isfib(number)

当然经过测试,它有效(但我不会这样推荐:D)

答案 1 :(得分:0)

您的fib功能错误(其中一个术语应为n-2)

答案 2 :(得分:0)

isfib()函数的最后一个elif没有返回自己的调用,即它调用自身而不对该结果做任何事情。

答案 3 :(得分:0)

简单地说,你调用的isfib(数字)与你原来给出的数字完全相同。你之前的“n = n + 1”表明你可能想要调用isfib(n)而不是isfib(数字)。

基本上isfib(数字)只是一个无限循环。

答案 4 :(得分:0)

我真的不知道你为什么要使用递归来解决这个问题。获得号码后,您就不知道n-1n-2是什么。因此,您无法在n-1n-2上进行递归。以下示例可以轻松检查数字是否为Fibonacci序列:

number = int(input("Enter your number:"))
def fib(n):
    ni = 1
    ni_minus_1 = 0
    while ni + ni_minus_1 < n:
        temp = ni_minus_1
        ni_minus_1 = ni
        ni = ni + temp
    if ni + ni_minus_1 == n:
        return True
    return False

print(fib(number))
  

更新
  我想你想通过递归来构建序列。例如,给定的数字是5,您想要返回Fibonacci序列中的第5个元素。然后代码如下:

def build_fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    return build_fib(n-1) + build_fib(n-2)
print(build_fib(6))