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

三元运算符在递归中的奇怪行为

是指在递归函数中使用三元运算符可能导致意外的结果或错误的递归调用。

在递归函数中,我们通常会使用条件语句来控制递归的终止条件。三元运算符是一种简洁的条件语句,它可以根据条件的真假选择不同的表达式进行计算。然而,当我们在递归函数中使用三元运算符时,需要注意以下几点:

  1. 终止条件的判断:三元运算符只能根据一个条件的真假选择不同的表达式,如果我们的终止条件涉及多个条件的判断,使用三元运算符可能会导致错误的递归调用。因此,在递归函数中,最好使用if语句来判断终止条件,以确保正确的递归终止。
  2. 递归调用的参数:递归函数的参数通常会在每次递归调用时发生变化,而三元运算符只能根据一个条件的真假选择不同的表达式,无法灵活地改变参数的值。因此,在递归函数中,如果需要根据不同的条件选择不同的参数值,最好使用if语句来进行条件判断和参数赋值。
  3. 代码可读性和维护性:三元运算符虽然可以简化代码,但在递归函数中使用过多的三元运算符可能会降低代码的可读性和维护性。递归函数通常比较复杂,使用if语句可以更清晰地表达逻辑,使代码更易于理解和修改。

总之,尽管三元运算符在递归函数中可以使用,但需要谨慎使用,避免出现奇怪的行为或错误的递归调用。在编写递归函数时,建议使用if语句来判断终止条件和参数赋值,以确保代码的正确性和可读性。

相关链接:

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

相关·内容

递归详解

用我们大脑来 构建调用栈 也很容易和清晰。函数调用单项一层层 下去,然后通过最终return条件,再一层层return回去( 归 )。...难 它不再是线性问题! 每一步都有两个不同选择。 咱不管这么多,先套递归特点:1、找子问题,构建合适递归公式;2、找到合适终止条件。...(如果此时`n = 3`,就得到了我们终止条件答案) 2、构建合适递归公式 通过上边找终止条件过程,抽象一下就会发现:我们本质就是寻找n - 1个台阶走法和n - 2个台阶走法一共有多少种。...我贴张图帮助你去思考: image.png 我着重圈了两个地方: 一个是不满足终止条件“过程” 该行为会按照我们递归公式,逐步递出全部可能性,也就是为什么想告知大家不要陷进去。...Exception in thread "main" java.lang.StackOverflowError 2、重复执行 这个问题算是递归中比较重点缺点。

50420

递归

用我们大脑来 构建调用栈 也很容易和清晰。函数调用单项一层层 下去,然后通过最终return条件,再一层层return回去( 归 )。...难 它不再是线性问题! 每一步都有两个不同选择。 咱不管这么多,先套递归特点:1、找子问题,构建合适递归公式;2、找到合适终止条件。...(如果此时`n = 3`,就得到了我们终止条件答案) 2、构建合适递归公式 通过上边找终止条件过程,抽象一下就会发现:我们本质就是寻找n - 1个台阶走法和n - 2个台阶走法一共有多少种。...我贴张图帮助你去思考: image.png 我着重圈了两个地方: 一个是不满足终止条件“过程” 该行为会按照我们递归公式,逐步递出全部可能性,也就是为什么想告知大家不要陷进去。...Exception in thread "main" java.lang.StackOverflowError 2、重复执行 这个问题算是递归中比较重点缺点。

1K65
  • 算法渣-递归算法

    函数实现时,因为解决大问题方法和解决小问题方法往往是同一个方法,所以就产生了函数调用它自身情况。另外这个解决问题函数必须有明显结束条件,这样就不会产生无限递归情况了。...递归中”就是入栈,递进;“归”就是出栈,回归 规模大转化为规模小是核心思想,但递归并非是只做这步转化,而是把规模大问题分解为规模小子问题和可以子问题解决基础上剩余可以自行解决部分。...而后者就是归精髓所在,是实际解决问题过程 为什么我老是有递归没有真的解决问题感觉? 因为是描述问题,归是解决问题。...而我大脑容易被占据,只往远方去了,连尽头都没走到,何谈回来 递归就是有去(去)有回(归来) 为什么可以”有去“?...}else{ //将问题转换为子问题描述每一步,都解决该步中剩余部分问题。

    73430

    重载运算符操作说明(一)

    重载运算符有特殊名字函数: 重载运算符名字由关键字operator 和其后要定义运算符号共同组成。 重载运算符也包含返回类型,参数列表,以及函数体。...如果重载一般它们行为将异于常态 从而导致类用户无法适应。...赋值和复合赋值运算符赋值运算符行为与复合版本类似 :赋值之后,左侧运算对象和右侧运算对象值相等,并且运算符应该返回它左侧运算对象一个引用。...下面的准则有助于我们运算符定义为成员函数还是普通非成员函数做出抉择: ●赋值(=)、下标([])、调用(l)和成员访问箭头(->)运算符必须是成员。...复合赋值运算符一般来说应该是成员,但并非必须,这一点与赋值运算符不同。 ●改变对象状态运算符或者与给定类型密切相关运算符,如递增、诚和解引用运算符,通常应该是成员。

    19920

    Python 进阶指南(编程轻松进阶):六、编写 Python 风格代码

    条件表达式:Python “丑陋”三元运算符 三元运算符(正式名称为条件表达式,有时 Python 中称为三元选择表达式)根据条件将表达式计算为两个值之一。...有可能滥用布尔运算符短路来创建一种三元运算符。...但是程序员还是继续使用这个假三元运算符,还有“为什么 Python 没有三元运算符?”成为 Python 核心开发人员一个长期问题。...创建条件表达式是为了让程序员不再要求三元运算符,也不会使用容易出错三元运算符。但是条件表达式也很丑陋,足以阻止程序员使用它们。...另外,虽然 Python 中没有switch语句,但是使用字典是一种简洁方法来实现它等价语句,而不需要使用几个if-elif-else语句,并且两个值之间求值时可以使用三元运算符

    94360

    4.Swift教程翻译系列——Swift基本运算符

    这样就避免了应该使用比較运算符==地方误用=。数学运算符(加减乘除模)会做溢出推断,这样避免了值溢出时候出现奇怪现象。你能够选择使用Swift提供溢出运算来同意溢出。...三元运算符涉及三个对象,并且Swift语言里面仅仅有一个三元操作符。(a ? b: c)毫无疑问。 运算符影响值叫运算元。 对于表达式1+2来说。...这里说建议尽量都是++i和–i形式,我JAVA里面都是写i++啊。 一元负运算符 数字符号能够用-来改变。...比后面用if简单介绍多了。还不用把rowHeight定义成变量。由于if里面根本不须要去改变rowHeight值。 三元运算符提供了一种高效方式来表达两选一情况。...可是使用三元运算符时候也要注意,假设太简洁了可能会减少代码可读性。避免结合多个三元运算符搞成一条语句。

    73610

    这4个JavaScript操作符,你知道是啥子吗?

    它们各自在语法上看起来很相似,但一定要读懂每一个,因为它们工作方式不同。 就让我们一探究竟吧! 1. ?? 操作符 JavaScript中,??...我们还使用了nullish运算符来提供默认值。这个函数将接受'0'这样虚值作为有效参数。这意味着我们预算可以被设置为0,而不会出现任何错误。 4. ? 操作符 三元运算符 ?...然而,你知道三元运算符可以用于变量赋值吗? var budget = 0var transportion = (budget > 0) ?...'Train' : 'Walking' console.log(transportion) // => 'Walking' 我们甚至可以用它来复制nullish赋值行为。...y : x} var x = nullishAssignment(null, 8) // => 8var y = nullishAssignment(4,8) // => 4 收尾之前,让我们使用三元运算符重构前面例子中函数

    47431

    递归和迭代

    一.递归(Recursion) 1.递归:以相似的方式重复自身过程 2.递归程序中表现为:函数定义中直接或间接调用函数自身 3.递归和循环: (1)递归是有去(去)有回(归来),因为存在终止条件...,比如你打开一扇门还有一扇门,不断打开,最终你会碰到一面墙,然后返回 (2)循环是有去无回,但可以设置终止条件,比如你打开一扇门还有一扇门,不断打开,还有门,没有终点 4.递归去和归来: (1)递归去...,须有个出口,化简为非递归状况处理 5.递归函数中具体形式: (1)必须明确终止条件,并给出终止时处理 (2)必须有间接或直接调用自身解决小规模问题步骤 def recursion(大规模问题)...二.迭代 1.迭代:是一种为了逼近所需目标或结果,不断用变量旧值递推新值过程 2.迭代程序中表现:函数不断调用原函数返回值, 3.迭代与循环,迭代和递归一样,也是循环一种 (1)循环...4.迭代和递归 (1)迭代:函数内某段代码实现循环,函数调用时使用前一次循环返回值作为初始值,A调用B,使5用计数器结束循环 (2)递归:重复调用自身实现循环,A调用A,设置结束条件 (3)递归中一定有迭代

    68830

    PHP 7.4 有哪些新特性

    PHP 7.4 主要特性包括以下几个, 短闭包函数(short closure) 预加载提交性能 属性类型限定 Improved type variance(不会翻译) 三元运算简写 数组展开运算 新增类魔术方法...:serialization 数字分隔符 运算优先顺序 允许__toString中抛出异常 支持反射引用 新增字节分割函数 移除php短标签 弃用左关联运算符 不再向后兼容变更 短闭包函数 短闭包函数可以减少冗余代码...预加载框架启动时在内存中加载文件,而且在后续请求中永久有效。 缺点:性能提升会在其他方面花费很大代价,每次预加载文件发生改变时,框架需要重新启动。...} } class B extends A { public function covariantReturnTypes(): ChildType { /* … */ } } 简写三元运算符...=会继续保留 弃用左关联运算符 PHP遗留了一些奇怪怪癖,比如 1 ? 2 : 3 ? 4 : 5; // 将会在 PHP 7.4 中废弃, PHP 8中会抛出编译错误 (1 ?

    1.1K10

    Swift基础 基本运算符

    算术运算符(+、-、*、/、%等)检测并禁止值溢出,以避免处理大于或小于存储它们类型允许值范围数字时出现意外结果。您可以选择使用Swift溢出运算符来评估溢出行为,如溢出运算符中所述。...注意 其余运算符(%)在其他语言中也被称为模运算符。然而,它在Swift中对负数行为意味着,严格来说,它是一个剩余操作,而不是一个模块化操作。 以下是剩余运算符工作原理。..., "dog") == (4, "dog") // true because 4 is equal to 4, and "dog" is equal to "dog" 在上面的示例中,您可以第一行看到从左到右比较行为...要将元组与七个或更多元素进行比较,您必须自己实现比较运算符三元条件运算符 三元条件算子是一个有三个部分特殊算子,它接受形式question?answer1:answer2。...三元条件算子为决定考虑两个表达式中哪一个提供了一个高效简写。然而,请小心使用三元条件操作员。如果过度使用,它简洁性可能会导致难以阅读代码。避免将三元条件运算符多个实例组合成一个复合语句。

    8200

    4个未听说过强大JavaScript操作符

    它们各自在语法上看起来很相似,但一定要读懂每一个,因为它们工作方式不同。 就让我们一探究竟吧! 1. ?? 操作符 JavaScript中,??...我们还使用了nullish运算符来提供默认值。这个函数将接受'0'这样虚值作为有效参数。这意味着我们预算可以被设置为0,而不会出现任何错误。 4. ? 操作符 三元运算符 ?...然而,你知道三元运算符可以用于变量赋值吗? var budget = 0var transportion = (budget > 0) ?...'Train' : 'Walking' console.log(transportion) // => 'Walking' 我们甚至可以用它来复制nullish赋值行为。...y : x} var x = nullishAssignment(null, 8) // => 8var y = nullishAssignment(4,8) // => 4 收尾之前,让我们使用三元运算符重构前面例子中函数

    60630

    为什么 Python、Go 和 Rust 都不支持三元运算符

    许多编程语言中,最常见写法是三元运算符,但是,Python 并不支持三元运算符,无独有偶,两个最热门新兴语言 Go 和 Rust 也不支持! 为什么 Python 不支持三元运算符呢?...本文将主要分析 Python 设计条件选择语法时过程,科普为什么它会采用现今与众不同实现方案,同时,我们也将考察为什么其它语言也要抛弃传统三元运算符。...三元运算符是对普通一重 if-else 结构简化,常用于一条语句中同时实现条件判断和取值操作。...但是这种写法 Python 中行为跟有些语言并不一样,使用不严谨的话,可能会酿成 Bug! 看看下面的两个例子,你觉得它们会得到什么结果呢?...为什么三元运算符 Rust 是多余呢?

    4.3K10

    计算机程序思维逻辑 (9) - 条件执行本质

    三元运算符 我们之前介绍了各种基本运算,这里介绍一个条件运算,和if/else很像,叫三元运算符,语法为: 判断条件 ?...表达式 1 : 表达式2 三元运算符会得到一个结果,判断条件为真的时候就返回表达式1值,否则就返回表达式2值。...三元运算符经常用于对某个变量赋值,例如求两个数最大值: int max = x > y ? x : y; 三元运算符完全可以用if/else代替,但在某些场景下书写更简洁。...从逻辑上讲,if/else, if/else if/else,三元运算符,switch都可以只用if代替,但使用不同语法表达更简洁,条件比较多时候,switch从性能上也更高(马上解释为什么)。...单一if情况下可能不用无条件跳转指令,但稍微复杂一些情况都需要。if, if/else, if/else if/else, 三元运算符都会转换为条件跳转和无条件跳转。但switch不太一样。

    1.1K100

    c#运算符和表达式

    按位与:&按位或:|按位异或:^按位非:~左移:>其他运算符C#还提供了一些其他类型运算符三元条件运算符:?:索引运算符:[]成员访问运算符:....运算符优先级没有括号情况下,运算符优先级决定了表达式中运算顺序。...:赋值运算符 =, +=, -=, 等等运算符重载C#允许开发者重载运算符,以自定义类或结构体运算符行为。...Func func = x => x > 10;运算符和表达式高级用法条件运算符条件运算符是一种简洁三元运算符,用于基于条件表达式计算两个值中一个。...int result = (5 + 3) * 2; // 结果为16运算符重载运算符重载允许自定义类型行为,使其可以像内置类型一样使用运算符

    41411

    zephir-(6)运算符

    #zephir-运算符# ##前言## 先在这里感谢各位zephir开源技术提供者 了解动态变量和静态变量之后我们今天来了解一下在编码工作中至关重要运算符zephir中使用,已经一些特殊函数对空验证等等之类操作讲解...运算符## Zephir运算符类似于PHP,也继承了他们一些行为。...取模 % b ###1.2 比较运算符### 比较运算符类型取决于变量相比,例如,如果两个操作数是动态变量相比PHP行为是一样: a == 平等...~a 左移位 << b 右移位 a >> 例子: if a & SOME_FLAG { echo "has some flag"; } ###1.5 三元运算符...总结## 本小节主要讲解了一些常用运算符和一些常用特殊函数,其实看起来和php中差别并不大,这也是作者用心,之后将来学习数组和对象相关知识希望大家喜欢!

    76590

    4个强大JavaScript运算符

    如果有,你会发现网上有很多 JS 资料,这使我们很容易忽略那些更为基础 JS 运算符。 这些运算符不常见但很强大!语法上看起来很相似,作用却不一样,一定要仔细阅读。 1. ??...非空运算符 JS 中,?? 运算符被称为非空运算符。...运算符允许我们忽略错误值(如 0 和空字符串)同时指定默认值。 2. ??= 空赋值运算符 ??= 也被称为空赋值运算符,与上面的非空运算符相关。...: 三元运算符 ?: 又叫条件运算符,接受三个运算数:条件 ? 条件为真时要执行表达式 : 条件为假时要执行表达式。...y : x } nullishAssignment(null, 8) // => 8 nullishAssignment(4, 8) // => 4 结束之前,让我们使用三元运算符重构前面示例中函数

    54210

    【Java 进阶篇】JavaScript三元运算符详解

    如果您是JavaScript初学者,或者希望更深入了解这门语言运算符,那么这篇博客将为您提供有关三元运算符全面指南。 什么是三元运算符?...JavaScript中,三元运算符是一种条件运算符,也称为条件表达式。这种运算符允许您基于某个条件结果来选择两个不同值之一。通常,它语法如下: condition ?...三元运算符主要作用是一行代码中根据条件返回不同值。它比使用if语句更紧凑,通常用于设置变量或返回值。 三元运算符基本用法 下面我们来看一些三元运算符基本用法示例,以便更好地理解它功能。...三元运算符与if语句比较 三元运算符提供了一种更紧凑方式来处理条件性赋值,但在某些情况下,使用if语句更为合适。下面是一些比较三元运算符和if语句情况: 1....JavaScript中一种强大工具,可用于两个可能值之间进行条件选择。

    40640

    经典递归问题--汉诺塔(java实现)

    static void main(String[] args) { int ret = fac(5); System.out.println(ret); } 这里就是fac...2.递归过程详细解释 我们通常能够看懂简单递归代码,但是自己上手写时候却总是想不到思路,这是因为我们对递归理解不够深入; 下面是对递归深入理解: 递归是一个整体动作 递归中 和 归...分别是两个独立过程 --> 开辟函数栈帧, 归 --> 销毁函数栈帧 程序执行递归过程 是先后归过程, 也是不断开辟函数栈帧把参数传递过去 ;同时不断返回数值,然后销毁函数栈帧过程...“过程” 蓝色箭头所指向部分 均是归过程 而函数栈帧内 就说我们常说 方法体,也可以叫做递推公式 二、汉诺塔问题 了解完递归原理之后,我们来解决一下汉诺塔问题 1.汉诺塔(hanoi)介绍...: 我们先假设只有一个盘子:方法很简答,就是从A->C 这里A表示是起始柱子,C表示结束柱子 我们通常不只是有一个盘子,但是最后一个盘子一定是从A->C,所以我们把 N个盘子分成两部分: 第一部分是上面

    15110

    PHP 三元运算很好用也很容易踩雷

    PHP 三元运算在日常编码中应用非常频繁,可以很好减少代码长度,减少if-else代码片段。但是好用是很好用,如果用不恰当也是非常容易踩雷。今天就看看PHP三元运算符有什么雷区。 ?..."3" :4; //$res = 3 echo $res; 网上很多都以"PHP三元运算符运算顺序是反"为标题文章,其实,执行顺序并不是反,而是运算符优先级问题。...2、PHP7中新三元运算与三元运算简写容易搞错 PHP7中新增三元运算符"??",PHP5.3之后,三元运算符可以简写成"?:"形式,这两者有什么区别呢?...$data['type']:-1; 日常开发当中,通常需要对数组键值是否存在进行判断。如果使用新三元运算符就会变得简单很多。...想明白你写到底是新三元运算符还是三元运算符简写形式。 总的来说,写三元运算符时候,尽量不要嵌套。如果要嵌套,也要明确用括号指定好运算优先级,避免产生不必要bug。

    1.2K20
    领券