函数sum(1)(2)(3)(4)...(n)实现无限累加
一开始看到这个题目我最先想到了闭包,
可能会这么写:
function sum(a){ return function(b){ return function(c){ return function(d){ ...... } } } }
或许也会这么写:
let sum = a => b => c => d => ... => a+b+c+d+...+n
但是不论是以上哪种方式,都需要先固定参数个数,因此这两种写法都不可取
解决办法——递归调用
方法一:使用toString打印
思路:当我们直接对函数使用 alert() 或 console.log() 时,函数的 toString() 方法会被调用。注意,valueOf方法会把数据类型转换成原始类型,toString方法会把数据类型转换成string类型,如果是对象会返回,toString() 返回 “[object type]”,其中type是对象类型。正常情况下,优先调用toString()。有运算操作符的情况下,valueOf()的优先级高于toString(),当调用valueOf()方法无法运算后还是会再调用toString()方法
代码:
function sum(a){ let temp = function(b){ return sum(a+b) } // temp.toString这里写成temp.valueOf也可以 temp.toString = function(){ return a } return temp } let ans = sum(1)(2)(3) console.log(ans)
执行sum(1),此时a=1,返回temp函数
②执行temp(2),这个函数内执行sum(a+b),即sum(a+b)=sum(1+2)=sum(3),此时a=3,并且返回temp函数
③执行temp(3),这个函数内执行sum(a+b),即sum(a+b)=sum(3+3)=sum(6),此时m=6,并且返回temp函数
④后面没有传入参数,等于返回的temp函数不被执行而是打印。代码中的temp.toString的重写只是为了函数不执行时能够返回最后运算的结果值,这里即为6
方法二:函数柯里化
思路:也是用到toString打印,但是这里用到了函数式编程的思想,这里的sum(1)(2)(3)(4)...(n)等价于sum(1)(2,3)(4)...(n),也等价于sum(1,2,3)(4)...(n)等多种排列组合
代码:
let sum = 0 function add (...args) { for(let i=0;i<args.length;i++){ sum = sum + args[i] } return sum } function currying (fn) { let val = null let temp = function(...newArgs) { val = fn.apply(this, newArgs) return temp } temp.toString = function(){ sum = 0 return val } return temp } let addCurry = currying(add) console.log(addCurry(1)(2)(3)(4, 5)) //15 这里是函数值为15,本质是函数字符串值 console.log(addCurry(1)(2)(3, 4, 5)) //15 console.log(addCurry(1, 2)(3, 4, 5)) //15
补充:
①函数柯里化就是只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。简单来说,就是每次调用函数时,它只接受一部分参数,并返回一个函数,直到传递所有参数为止
②toString返回的是函数字符串值,后期可以通过Number函数将函数字符串值转换为数值
扩展:求sum(1)(2)(3)...(n)()
方法一:
代码:
function sum(a){ return function(b){ if(b!==undefined){ return sum(a+b) }else{ return a } } } let ans = sum(1)(2)(3)() console.log(ans)
方法二——函数柯里化
代码:
function add (...args) { //求和 return args.reduce((a, b) => a + b) } function currying (fn) { let args = [] return function temp (...newArgs) { if (newArgs.length) { args = [ ...args, ...newArgs ] return temp } else { let val = fn.apply(this, args) args = [] //保证再次调用时清空 return val } } } let addCurry = currying(add) // 注意调用方式的变化 console.log(addCurry(1)(2)(3)(4, 5)()) //15 console.log(addCurry(1)(2)(3, 4, 5)()) //15 console.log(addCurry(1)(2, 3, 4, 5)()) //15
参考:
https://juejin.im/post/5e6ed0bc6fb9a07c8334f75c
https://juejin.im/post/5e40b566e51d4526ea7ee623
原文地址:https://www.cnblogs.com/FHC1994/p/12777417.html
- SwitchButton 开关按钮 的多种实现方式
- SVN和Git对比梳理
- linux下expect环境安装以及简单脚本测试
- 泛型List<T>使用示例
- linux系统最小化安装后的初始化脚本
- 简单对比git pull和git pull --rebase的使用
- VS 2010一步步开发windows服务(windows service)
- 运算符重载,以及迭代器[foreach]示例
- 牛津大学王宁博士:大数据与有限理性
- 侃哥:苹果服软了就“降速门”公开致歉并祭出优惠
- 委托示例(利用委托对不同类型的对象数组排序)
- event & delegate Demo(事件&委托示例)
- 最简单的匿名方法与委托示例
- Eclipse与Android源码中ProGuard工具的使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 天气APP(二十七)增加地图天气的逐小时天气、太阳和月亮数据
- Android 天气APP(二十八)地图搜索定位
- DevEco Studio项目构建讲解、编写页面、布局介绍、页面跳转
- Android 天气APP(二十九)壁纸设置、图片查看、图片保存
- Chrome 私人珍藏-stylus插件实现个性化百度界面定制
- Python 基础篇-简单的异常捕获
- Python 技巧篇-让我的程序暂停一下
- Python+selenium 技术篇-浏览器后台运行
- Python 基础篇-python3安装pyHook和pywin32库
- 漫画:如何螺旋遍历二维数组?(修订版)
- 一文快速入门分库分表(必修课)
- 写出漂亮 Python 代码的 20条准则
- 简单red5+obs推流实现直播系统开发,具体设置介绍
- 使用pandas进行数据快捷加载
- 关于 JavaScript 中 null 的一切