为什么 ES6 中的这个函数组合(带有尾递归)返回未定义但累加器 returns 是正确的结果?
Why does this function composition ( with tail recursion ) in ES6 returned undefined but the accumulator returns the correct result?
我正在尝试编写一个组合函数,它可以接受任意数量的函数,将它们存储在一个闭包中,并将这些函数中的每一个应用到一个初始值。函数组合的实际应用在尾调用递归 _lCompose() 中执行。我 运行 遇到的问题是基本情况 console.log('acc', acc) 正确的值但是 'return acc' returns 未定义
function addOne (a ) {
console.log('addone', a, a + 1)
return a + 1
}
function double (a) {
console.log('double', a, a * 2)
return a * 2;
}
function square (a) {
console.log('square', a, a * a)
return a * a;
}
const lCompose = (...args) => {
function _lCompose ( initialValue, acc, ...args ) {
//base case when no args remain, return acc
if ( !args.length ) {
console.log('acc', acc)
return acc;
} else {
// recurse, shift ...args and call head(acc)
const [head, ...tail] = args;
console.log('head', head)
const _acc = head(acc);
_lCompose (initialValue, _acc, ...tail )
}
}
// use _v twice to set as initial value and initial accumulator
return (initV, initAcc) => _lCompose(initV, initAcc, ...args)
}
const trans = lCompose(addOne, double, square);
trans(5, 5) // should return 144
因为你忘了return
递归调用的结果。
<b>return</b> _lCompose (initialValue, _acc, ...tail )
const addOne = a => a + 1;
const double = a => a * 2;
const square = a => a * a;
const lCompose = (...args) => {
function _lCompose ( initialValue, acc, ...args ) {
if ( !args.length ) {
return acc;
} else {
const [head, ...tail] = args;
const _acc = head(acc);
return _lCompose (initialValue, _acc, ...tail )
}
}
return (initV, initAcc) => _lCompose(initV, initAcc, ...args)
}
const trans = lCompose(addOne, double, square);
console.log(trans(5, 5)); // 144
我正在尝试编写一个组合函数,它可以接受任意数量的函数,将它们存储在一个闭包中,并将这些函数中的每一个应用到一个初始值。函数组合的实际应用在尾调用递归 _lCompose() 中执行。我 运行 遇到的问题是基本情况 console.log('acc', acc) 正确的值但是 'return acc' returns 未定义
function addOne (a ) {
console.log('addone', a, a + 1)
return a + 1
}
function double (a) {
console.log('double', a, a * 2)
return a * 2;
}
function square (a) {
console.log('square', a, a * a)
return a * a;
}
const lCompose = (...args) => {
function _lCompose ( initialValue, acc, ...args ) {
//base case when no args remain, return acc
if ( !args.length ) {
console.log('acc', acc)
return acc;
} else {
// recurse, shift ...args and call head(acc)
const [head, ...tail] = args;
console.log('head', head)
const _acc = head(acc);
_lCompose (initialValue, _acc, ...tail )
}
}
// use _v twice to set as initial value and initial accumulator
return (initV, initAcc) => _lCompose(initV, initAcc, ...args)
}
const trans = lCompose(addOne, double, square);
trans(5, 5) // should return 144
因为你忘了return
递归调用的结果。
<b>return</b> _lCompose (initialValue, _acc, ...tail )
const addOne = a => a + 1;
const double = a => a * 2;
const square = a => a * a;
const lCompose = (...args) => {
function _lCompose ( initialValue, acc, ...args ) {
if ( !args.length ) {
return acc;
} else {
const [head, ...tail] = args;
const _acc = head(acc);
return _lCompose (initialValue, _acc, ...tail )
}
}
return (initV, initAcc) => _lCompose(initV, initAcc, ...args)
}
const trans = lCompose(addOne, double, square);
console.log(trans(5, 5)); // 144