首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我声明的函数中的递归不起作用?

在声明的函数中使用递归时,可能会出现递归不起作用的情况。这种情况通常有以下几个可能的原因:

  1. 错误的递归终止条件:递归函数需要一个终止条件,当满足该条件时,递归将停止执行。如果终止条件错误或不完整,递归就无法正常结束。确保递归终止条件正确且能够被满足,避免进入无限递归的循环。
  2. 参数传递错误:在递归调用时,需要正确传递参数。如果参数传递错误,递归的结果可能不符合预期。确保在每次递归调用时,传递正确的参数。
  3. 堆栈溢出:递归过深或递归次数过多可能导致堆栈溢出。某些编程语言和环境对递归的调用深度有限制。当递归调用超出该限制时,程序将抛出异常或崩溃。如果遇到递归不起作用的情况,可以尝试减少递归深度或优化递归算法。
  4. 变量作用域问题:递归函数中的变量作用域需要正确处理。如果变量的作用域范围不正确,递归调用时可能会出现变量值不一致的情况。确保递归函数中的变量在递归调用时能够正确保存和更新。
  5. 递归函数未正确调用:在某些情况下,可能由于疏忽或错误导致递归函数未被正确调用,例如遗漏了递归调用语句或将递归调用放在了错误的位置。仔细检查代码,确保递归函数被正确调用。

综上所述,递归不起作用的原因可能是错误的递归终止条件、参数传递错误、堆栈溢出、变量作用域问题或递归函数未正确调用。在调试递归问题时,可以逐步排查这些可能的原因,并根据具体情况进行修正。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 为什么坚持使用 JavaScript 函数声明

    ; 这个函数表达式体现了 ES 2015 最大亮点——箭头函数(Arrow function),精简可爱,简直迷死人。第一次看到它时,内心戏是:“憋说话,吻”!...即使是免费 Babel(JavaScript编译器),也无法阻挡函数声明喜爱。...对箭头函数绝对是真爱,但要声明一个顶级函数时,仍用“土气”函数声明为什么呢?“Uncle Bob” Martin 是这么说: 花1小时写代码,就要花10小时检查代码。...都退后,要开始装逼了 Fair warning:接下来要放大招了——下文“行话”连篇,但你只要明白在声明之前不能使用常数就好。...我会用编译器、转译器、压缩工具等来优化机器代码。但是优化代码对来说就是让其更简单易懂。 3 关于箭头函数 是的,箭头函数是真爱啊。 一般会用箭头函数来通过一个小函数,将其作为更高阶函数值。

    1.1K80

    JS if 函数声明提升

    可以看到, 给a赋值5, 并没有赋值到全局变量a上 解决 先看看MDN里说明 ? 从ES6开始 在严格模式下,块里函数作用域为这个块。ES6之前不建议块级函数在严格模式下使用....在ES6非严格模式下, 块函数声明会出现提升, 所以最好使用函数表达式来定义函数 ---- 走走流程看看到底发生了啥 我们可以先把, function a () {}注释掉, 可以看到报错了, Uncaught...ReferenceError: a is not defined, 所以if里函数声明确实存在变量提升 ?...然后, 我们可以打点调试一下 在if a=1语句之前, 我们可以看到函数声明已经提升了, 此时if作用域里a为函数 ? 而全局a还是undefined ?...随后运行a=5, 则只是在块级作用域里赋值, 不会对全局作用域a值进行修改 ---- 当然, 如果使用函数表达式来声明函数的话, 可以避免 var a if (true) { console.log

    3.7K20

    为什么你学不会递归?告别递归,谈谈经验

    可能也有一大部分人知道递归,也能看递归,但在实际做题过程,却不知道怎么使用,有时候还容易被递归给搞晕。也有好几个人来问我有没有快速掌握递归捷径啊。...递归三大要素 第一要素:明确你这个函数想要干什么 对于递归觉得很重要一个事就是,这个函数功能是什么,他要完成什么样一件事,而这个,是完全由你自己来定义。...第二要素:寻找递归结束条件 所谓递归,就是会在函数内部代码,调用这个函数本身,所以,我们必须要找出递归结束条件,不然的话,会一直调用自己,进入无底洞。...但是告诉你,它等价条件,一定是范围不断在缩小,对于链表来说,就是链表节点个数不断在变小,所以,如果你实在找不出,你就先对 reverseList(head.next) 递归走一遍,看看结果是咋样...有些人可能觉得讲有点简单,没事,后面会找一些不怎么简单题。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

    71830

    函数(三)(函数声明

    函数声明 C语言函数调用要求是先定义后使用,就是要求被调用函数定义在主调函数之前。 如果在程序自定义函数时,需要将被调函数定义在主调函数后面,就需要函数调用之前加上函数原型声明。...如果在函数调用之前既无函数定义,也无函数声明,编译时会出错。 函数原型声明一般形式: 类型说明符 函数名(形式参数声明列表); 例:定义计算圆面积函数,在主函数输入半径并计算面积。...return ; } double circle(double radius) { return PI * radius * radius; } 函数声明函数名后面的圆括号可以只给出形参类型...,省略形参名称。...例如本例第5行函数声明可以写成如下形式: double circle(double); 如果在源程序文件开头部分,所有函数定义前面进行函数声明,则该源程序文件中所有的函数都可以调用被声明函数

    64810

    函数递归

    递归是什么? 递归是学习C语⾔函数绕不开⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题方法,在C语⾔递归就是函数⾃⼰调⽤⾃⼰。 ...递归与迭代 递归是⼀种很好编程技巧,但是和很多技巧⼀样,也是可能被误⽤,就像举例1⼀样,看到推导 公式,很容易就被写成递归形式: Fact函数是可以产⽣正确结果,但是在递归函数调⽤过程涉及...在C语⾔每⼀次函数调⽤,都需要为本次函数调⽤在内存栈区,申请⼀块内存空间来保存函数调 ⽤期间各种局部变量值,这块空间被称为运⾏时堆栈,或者函数栈帧。...函数不返回,函数对应栈帧空间就⼀直占⽤,所以如果函数调⽤存在递归调⽤的话,每⼀次递归 函数调⽤都会开辟属于⾃⼰栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。...,这个计算所花费时间,是我们很难接受, 这也说明递归写法是⾮常低效,那是为什么呢?

    5010

    为什么你学不会递归?告别递归,谈谈一些经验

    可能也有一大部分人知道递归,也能看递归,但在实际做题过程,却不知道怎么使用,有时候还容易被递归给搞晕。也有好几个人来问我有没有快速掌握递归捷径啊。...递归三大要素 第一要素:明确你这个函数想要干什么 对于递归觉得很重要一个事就是,这个函数功能是什么,他要完成什么样一件事,而这个,是完全由你自己来定义。...第二要素:寻找递归结束条件 所谓递归,就是会在函数内部代码,调用这个函数本身,所以,我们必须要找出递归结束条件,不然的话,会一直调用自己,进入无底洞。...1、第一递归函数功能 假设 f(n) 功能是求青蛙跳上一个n级台阶总共有多少种跳法,代码如下: int f(int n){ } 2、找出递归结束条件 说了,求递归结束条件,你直接把 n 压缩到很小很小就行了...但是告诉你,它等价条件,一定是范围不断在缩小,对于链表来说,就是链表节点个数不断在变小,所以,如果你实在找不出,你就先对 reverseList(head.next) 递归走一遍,看看结果是咋样

    50400

    为什么你学不会递归?告别递归,谈谈一些经验

    可能也有一大部分人知道递归,也能看递归,但在实际做题过程,却不知道怎么使用,有时候还容易被递归给搞晕。也有好几个人来问我有没有快速掌握递归捷径啊。...递归三大要素 第一要素:明确你这个函数想要干什么 对于递归觉得很重要一个事就是,这个函数功能是什么,他要完成什么样一件事,而这个,是完全由你自己来定义。...第二要素:寻找递归结束条件 所谓递归,就是会在函数内部代码,调用这个函数本身,所以,我们必须要找出递归结束条件,不然的话,会一直调用自己,进入无底洞。...1、第一递归函数功能 假设 f(n) 功能是求青蛙跳上一个n级台阶总共有多少种跳法,代码如下: 1int f(int n){ 2 3} 2、找出递归结束条件 说了,求递归结束条件,你直接把 n...但是告诉你,它等价条件,一定是范围不断在缩小,对于链表来说,就是链表节点个数不断在变小,所以,如果你实在找不出,你就先对 reverseList(head.next) 递归走一遍,看看结果是咋样

    94610

    为什么你学不会递归?告别递归,谈谈一些经验

    可能也有一大部分人知道递归,也能看递归,但在实际做题过程,却不知道怎么使用,有时候还容易被递归给搞晕。也有好几个人来问我有没有快速掌握递归捷径啊。...递归三大要素 第一要素:明确你这个函数想要干什么 对于递归觉得很重要一个事就是,这个函数功能是什么,他要完成什么样一件事,而这个,是完全由你自己来定义。...第二要素:寻找递归结束条件 所谓递归,就是会在函数内部代码,调用这个函数本身,所以,我们必须要找出递归结束条件,不然的话,会一直调用自己,进入无底洞。...1、第一递归函数功能 假设 f(n) 功能是求青蛙跳上一个n级台阶总共有多少种跳法,代码如下: int f(int n){ } 2、找出递归结束条件 说了,求递归结束条件,你直接把 n 压缩到很小很小就行了...但是告诉你,它等价条件,一定是范围不断在缩小,对于链表来说,就是链表节点个数不断在变小,所以,如果你实在找不出,你就先对 reverseList(head.next) 递归走一遍,看看结果是咋样

    70330

    Javascript函数声明函数表达式

    ; }(); 试一下就知道这段代码意思就是声明一个函数,然后立刻执行,因为Javascript变量作用域是基于函数,所以这样可以避免变量污染,但这里位运算符『~』乍一看让人摸不到头脑...在阐述为什么之前,让我们先来明确Javascript两个概念:函数声明函数表达式: 先来看看什么样函数声明: function() { alert("hello, world...function() { alert("hello, world."); }; 现在回头看看文章开头问题,为什么去掉位操作符『~』后运行会报错,这是因为从语法解析角度看...,Javascript不允许在函数声明后面直接使用小括号,而函数表达式则没有这个限制,通过在函数声明前面加上一个『~』操作符,就可以让语法解析器把后面看成是函数表达式,同样,在函数声明前面加上『!...,+,-』等操作符也是可行。 那我们为什么不使用下面这种函数表达式方式呢?

    56520

    为什么你学不会递归?告别递归,谈谈一些经验

    可能也有一大部分人知道递归,也能看递归,但在实际做题过程,却不知道怎么使用,有时候还容易被递归给搞晕。也有好几个人来问我有没有快速掌握递归捷径啊。...递归三大要素 第一要素:明确你这个函数想要干什么 对于递归觉得很重要一个事就是,这个函数功能是什么,他要完成什么样一件事,而这个,是完全由你自己来定义。...第二要素:寻找递归结束条件 所谓递归,就是会在函数内部代码,调用这个函数本身,所以,我们必须要找出递归结束条件,不然的话,会一直调用自己,进入无底洞。...1、第一递归函数功能 假设 f(n) 功能是求青蛙跳上一个n级台阶总共有多少种跳法,代码如下: 1int f(int n){ 2 3} 2、找出递归结束条件 说了,求递归结束条件,你直接把 n...但是告诉你,它等价条件,一定是范围不断在缩小,对于链表来说,就是链表节点个数不断在变小,所以,如果你实在找不出,你就先对 reverseList(head.next) 递归走一遍,看看结果是咋样

    51710

    js函数声明你真的会了吗???

    答案:undefined 30 报错:b is not defined 解析:1、没有用var声明是全局变量,即便在函数内部; 2、只有在function内部新声明才是局部变量,在if,while,...for等声明变量其实是全局变量(除非本身在function内部) 3、因为变量提升,虽然if块内容没执行,但是预解析阶段会执行var a,只是没有赋值而已,因此打印a是undefined而打印b会报错...在任何时代, 教育说起来都是一件高大上事, 但却没有什么真正有价值东西是教得会, 没有任何一种文化模因 可以说清楚一个个体全部问题。...那时候相忘于江湖事,或许穿越了时光,有了新世界 那时候不远万里追寻的梦,也许穿行过人海,也有了新意义 而对于我们来说,那个惦念江湖,那个执着梦,其核心都是在偌大世界里,寻找到更真实更好自己...知道你会来 所以我一直在这里等 岁月不饶人,亦未曾绕过岁月 最后,大家有什么想要吐槽,就在留言区说出你想法。

    1.6K20

    js构造函数和普通函数区别_函数声明函数定义

    大家好,又见面了,是你们朋友全栈君。 1、构造函数也是一个普通函数,创建方式和普通函数一样,但构造函数习惯上首字母大写 2、构造函数和普通函数区别在于:调用方式不一样。...普通函数调用方式:直接调用 person(); b.构造函数调用方式:需要使用new关键字来调用 new Person(); 4、构造函数函数名与类名相同:Person( ) 这个构造函数...A、立刻在堆内存创建一个新对象 B、将新建对象设置为函数this C、逐个执行函数代码 D、将新建对象作为返回值 6、普通函数例子...:因为没有返回值,所以为undefined 7、构造函数例子:构造函数会马上创建一个新对象,并将该新对象作为返回值返回 8、用instanceof 可以检查一个对象是否是一个类实例...,是则返回true; 所有对象都是Object对象后代,所以任何对象和Object做instanceof都会返回true 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    3.2K10

    递归函数优化

    本文作者:IMWeb 寒纱阁主 原文出处:IMWeb社区 未经同意,禁止转载 递归函数是一个函数自我调用而构成,如下是一个典型递归阶乘函数: function factorial(num)...factorial; factorial=null; alert(factorial(5)); 此时会报错: Exception: TypeError: factorial is not a function 为什么会出现这种问题呢...原因就出在return num*factorial(num-1)这一句上,这种写法使得函数太过紧密,一旦将函数保存到另一个变量,并将原变量设置为null,factorial便不再是函数,因此会报错。...解决方法:arguments.callee arguments.callee是一个指向正在执行函数指针,修改后代码如下: function factorial(num){ if(num<=1){...f 表达式,并将其赋值给factorial,这样一来即便将函数赋值给其他变量,函数名 f 依然有效。

    70430

    递归函数优化

    本文作者:IMWeb 寒纱阁主 原文出处:IMWeb社区 未经同意,禁止转载 递归函数是一个函数自我调用而构成,如下是一个典型递归阶乘函数: function factorial(num)...factorial; factorial=null; alert(factorial(5)); 此时会报错: Exception: TypeError: factorial is not a function 为什么会出现这种问题呢...原因就出在return num*factorial(num-1)这一句上,这种写法使得函数太过紧密,一旦将函数保存到另一个变量,并将原变量设置为null,factorial便不再是函数,因此会报错。...解决方法:arguments.callee arguments.callee是一个指向正在执行函数指针,修改后代码如下: function factorial(num){ if(num<=1){...f 表达式,并将其赋值给factorial,这样一来即便将函数赋值给其他变量,函数名 f 依然有效。

    930100

    JS函数声明函数表达式异同

    这里就涉及到了函数传递,函数传递是传引用,就是说函数存在内存某个位置,nameAlert和anotherNameAlert是都是函数一个引用,把函数名nameAlert赋值给anotherNameAlert...不同点 注:函数声明函数表达式不同点包括但不限于以下几点 相对函数声明函数表达式之间相同点,它们不同点更应该值得我们关注。下面结合自己理解聊聊。...-- 函数表达式 --> var sayTruth=function(){ alert('myvin is handsome.'); } ECMAScript规范中表示,函数声明语句可以出现在全局代码...JavaScript对于这条规范实现并不是严格遵守,FF中允许if中出现函数声明。 但不管规范怎么样,造成这样原因还是函数声明提前。 还是引用上文例子和说明: 为什么呢?...对于函数声明,js解析器会优先读取,确保在所有代码执行之前声明已经被解析,而函数表达式,如同定义其它基本类型变量一样,只在执行到某一句时也会对其进行解析,所以在实际,它们还是会有差异,具体表现在,

    1.2K50
    领券