当前位置: 首页 > 知识库问答 >
问题:

递归不终止于Python

荆城
2023-03-14

我试图写一个程序,找出给定的数字是否在斐波那契序列中,我不断得到不终止的递归,我不知道为什么。第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)

共有3个答案

鲍俊杰
2023-03-14

isfib()函数的最后一个elif不是返回对自身的调用,也就是说,它正在调用自身,并且没有对该结果做任何操作。

闻人越
2023-03-14

你的fib功能错了(其中一项应该是n-2)

颛孙飞
2023-03-14

有很多小错误,所以我纠正了这些错误(我已经添加了一个更好的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)

既然你已经使用了很多递归,我猜你想只使用递归来做这件事。所以,代码是这样的:数字=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)

 类似资料:
  • 问题内容: 在这个sqlfiddle中… http://sqlfiddle.com/#!6/b6587/6 我收到以下错误…。 声明终止。在语句完成之前,最大递归100已用尽。 我知道CTE第二选择的where子句中需要进行“终止检查”。即使您取消注释WHERE子句,我也会遇到相同的错误。 我只是想了解1)为什么根本需要它……毕竟每个订单行都与每个客户行都有关系,2)由于需要“终止检查”,因此该示

  • 我有一个方法getNextPrime(int num),它应该在该方法接收的值之后识别最接近的质数。 如果num是偶数,它将递增它并再次调用自己。如果它是奇数,它将运行一个for循环来检查它是否可以被3和num的一半值之间的奇数整除。如果是,那么它将把num增加2,方法将再次调用自己,否则它将返回新的num值,这是一个质数。 问题是,当程序到达return语句时,它将跳转到if语句并返回num 1

  • 问题内容: 这是一个程序,它使用递归和执行程序来读取以前格式的信息站点。它工作正常,我的问题是测试程序是否完成和成功通知。 如果 levels.length = 1 ,则规则执行器运行良好,但是如果 levels.length > 1将出现错误:线程“ pool-1-thread-138”中的异常java.util.concurrent.RejectedExecutionException 问题答

  • 在我的progress函数中,它将到达递归的底部,但是我期望返回的值没有改变。 这应该返回true,它符合条件(记录文本),但随后继续移动,并且始终返回false。

  • 请解释返回语句如何为trie的简单递归解析起作用 案例A: 案例B: 案例A对我很有效。但是,我不明白结果被推到堆栈后会发生什么。“it”如何知道终止这些路径?