JavaScript两个sumTo递归函数等价性与条件运算符用法疑问
两个JavaScript sumTo递归函数的等价性说明
1. 非布尔值作为判断条件的原理
JavaScript在所有需要布尔值的上下文(包括if判断、三元运算符的条件位)会自动执行隐式布尔类型转换,所有值都可以被归为真值(truthy)或假值(falsy):
- 固定的假值仅有以下几类:
false、0、-0、0n(BigInt零)、""(空字符串)、null、undefined、NaN - 除以上值外,所有其他值都是真值,会被转换为
true
2. 两个函数逻辑完全等价
我们可以分别拆解两个函数的执行逻辑:
Function 1逻辑
function sumTo(n) { if (n === 0) return 0; // base case return n + sumTo(n-1); // inductive step }
对应逻辑:
- 当
n等于0时,返回0 - 其他情况返回
n + sumTo(n-1)
Function 2逻辑
function sumTo(n) { return n ? n + sumTo(n-1) : 0; }
三元运算符的规则是:判断条件 ? 条件为真时返回的值 : 条件为假时返回的值
对应逻辑:
- 当
n是真值(输入为非负整数的场景下即n不等于0),返回n + sumTo(n-1) - 当
n是假值(输入为非负整数的场景下即n等于0),返回0
二者的执行逻辑和返回结果完全一致,是等价的实现。
3. 常见误区说明
你猜测的「作为判断条件的n等价于n !== 0」在输入为非负整数的场景下完全成立。你之前认为应该写成return n ? 0 : n + sumTo(n-1)是混淆了三元运算符的分支顺序:三元运算符第一个分支是条件成立时的执行路径,第二个是条件不成立时的执行路径,反过来写会得到完全相反的逻辑,和原函数功能不符。
内容的提问来源于stack exchange,提问作者Ning
相关产品推荐
相关产品推荐

