Debugging 调试递归非常困难

Debugging 调试递归非常困难,debugging,recursion,Debugging,Recursion,我得到了一个无限递归错误,我知道它的发生是因为一个基本情况丢失了,所以它自己执行了很多次,以至于超过了调用堆栈。但我的问题是,要找到它到底在哪里缺少基本情况,而要做到这一点,只需在浏览器中使用开发人员工具调试器就需要几个小时。那么,有没有什么方法可以让我快速完成并跳转到基本情况缺失的地方呢? (在执行时暂停对递归不起作用)不,没有办法做你想做的事。如果你有一个无限的while循环,你就不会期望计算机神奇地告诉你循环应该什么时候结束,因为计算机不知道你想要什么。类似地,如果你有无限递归,计算机无法

我得到了一个无限递归错误,我知道它的发生是因为一个基本情况丢失了,所以它自己执行了很多次,以至于超过了调用堆栈。但我的问题是,要找到它到底在哪里缺少基本情况,而要做到这一点,只需在浏览器中使用开发人员工具调试器就需要几个小时。那么,有没有什么方法可以让我快速完成并跳转到基本情况缺失的地方呢?
(在执行时暂停对递归不起作用)

不,没有办法做你想做的事。如果你有一个无限的
while
循环,你就不会期望计算机神奇地告诉你循环应该什么时候结束,因为计算机不知道你想要什么。类似地,如果你有无限递归,计算机无法告诉你递归应该在哪里结束,因为计算机不知道你想要什么

编程和递归都有一些通用技巧,可以简化任务

首先,尽量简化代码。如果您的代码太复杂,请尝试将代码拆分为助手函数,并使用文档注释或文档字符串准确记录代码应该执行的操作,然后一次测试一个函数。如果您正在编写一个基本的factorial函数,那么如果您在递归方面有任何实践,您几乎无法想象会错过基本情况,因为代码很短。但是如果你写的东西非常复杂(比如10多行),很容易出错


其次,您应该确保您对“输入的大小”有一个正确的概念,并确保每当您进行递归调用时,都会对较小的输入进行调用。请记住,“大小”必须由一个无符号整数(又称自然数)来度量——不能让大小为负数,也不能让大小为分数。只要执行这些检查,递归将始终终止。

相对便宜:在递归步骤之前打印您调用的值。或在启动函数时打印参数值。您可以快速滚动日志,找到打印行开始重复的位置。您的递归算法在处理这些或前面的问题时遇到问题。