使用arguments属性的递归Javascript函数给出了正确的答案,但返回undefined

时间:2017-12-31 03:51:38

标签: javascript recursion return arguments

我正在构建一个代数计算器,我正在研究递归函数来从多项式中过滤类似的项。下面的函数的作用是它产生所需的类似术语数组。我可以通过向函数添加console.log语句来验证这一点。但是,由于某种原因,该函数不会返回输出。它返回“未定义”。

我的想法是,递归调用链应该以下面指出的结束条件终止,然后将返回的参数[1]数组传递给堆栈。

我在这里读过类似的问题,这个人忘记在一个或多个地方寄回报。但是,在我的代码中,我有一个带有结束条件和递归函数调用的return语句。这可能是我想念的简单事情。

JS

2 个答案:

答案 0 :(得分:0)

更聪明,更努力

尽量不要用不必要的变量,赋值或逻辑条件伤害你的头脑 - 一个简单的相等测试的简单递归函数



const eq = x => y =>
  x === y

const neq = x => y =>
  x !== y

const filterLikeTerms = ([ x, ...xs ]) =>
  x === undefined
    ? []
    : [ xs.filter (eq (x)) ]
      .concat (filterLikeTerms (xs.filter (neq (x))))

const data =
  ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd', 'a', 'a', 'b']

console.log (filterLikeTerms (data))
// [ [ a, a, a ]
// , [ b, b ]
// , [ c ]
// , [ d ]
// ]




灵活实施

如果您想要更改项目的比较和分组方式,请更改eqneq

// for example ...
const eq = x => y =>
  x.toString() === y.toString()

const neq = x => y =>
  x.toString() !== y.toString()

如果您想像在原始代码中那样使用累加器参数,那也很好 - 对于非常大的输入,可以轻松地为stack-safe创建此表单

const filterLikeTerms = ([ x, ...xs ], acc = []) =>
  x === undefined
    ? acc
    : filterLikeTerms ( xs.filter (neq (x))
                      , acc.concat ([ xs.filter (eq (x)) ])
                      )

工作更聪明

正确的尾调用(紧接在上面)使我们使用大量数据输入,但是我们的函数效率非常低,因为为列表中的每个项运行多个过滤器。我们可以使用Map进行显着改进 - 现在我们只触摸原始输入中的每个项目一次



const filterLikeTerms = ([ x, ...xs ], acc = new Map) =>
  x === undefined
    ? Array.from (acc.values ())
    : acc.has (x)
      ? filterLikeTerms (xs, acc.set (x, [x].concat (acc.get (x))))
      : filterLikeTerms (xs, acc.set (x, [x]))

const data =
  ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd', 'a', 'a', 'b']

console.log (filterLikeTerms (data))




不要停止学习

你可以自己制作各种各样的东西。以下是我写的与此答案相关的一些内容:

答案 1 :(得分:0)

在ES6中:

public class Main {
    public static void main(String[] args) {
        byte b =  -2;
        int i = 0 ;
        i = ( b & 0b1111_1111 ) ;
        System.err.println(i);
    }
}