我正在try 编写一个尾部递归函数CONTAINS(TREE,ELEMENT),如果元素存在于二叉树中,则返回TRUE,否则返回FALSE.

我写了递归函数,问题是我不知道如何使它尾部递归

let leaf = { val: 6 }
let tree = {
  val: 10,
  sx: {
    val: 5,
    sx: {
      val: 13
    },
    dx: leaf
  },
  dx: {
    val: 32,
    sx: null,
    dx: null
  }
}

function contains(t,x) {

  if(t.val == x)
    return 1;

  let res = 0 ;
  if(t.sx)
    res += contains(t.sx,x)
  if(t.dx)
    res += contains(t.dx,x)

  return Boolean(res)
}

console.log(contains(tree,6))

推荐答案

我认为这不可能实现完全的尾递归,因为递归调用的数量可能是1或2(或0)-在2的情况下,您不能无条件地返回函数的最终计算,因为您不知道特定的递归调用will是否是函数的最终计算.

也就是说,您可以对代码进行一些改进.如果val个匹配,则返回true,如果它们为真,则立即返回第一个递归调用,而不是与res变量相加.第二个调用可以是尾递归的,因为在这一点上,分支中没有什么需要判断的.

let leaf = {
  val: 6
}
let tree = {
  val: 10,
  sx: {
    val: 5,
    sx: {
      val: 13
    },
    dx: leaf
  },
  dx: {
    val: 32,
    sx: null,
    dx: null
  }
}

function contains(t, x) {
  if (t.val == x) {
    return true;
  }
  // Recursive, but not tail recursive:
  if (t.sx && contains(t.sx, x)) {
    return true;
  }
  // Tail recursive:
  return !t.dx ? false : contains(t.dx, x);
}

console.log(contains(tree, 6))

Javascript相关问答推荐

我无法在NightWatch.js测试中获取完整的Chrome浏览器控制台日志(log)

如何在表格上拥有水平滚动条,在正文页面上拥有垂直滚动条,同时还对html表格的标题使用位置粘性?

在贝塞尔曲线的直线上找不到交叉点:(使用@Pomax的bezier.js)

通过嵌套模型对象进行Mongoose搜索

React Code不在装载上渲染数据,但在渲染上工作

PrivateRoute不是路由组件错误

WebGL 2.0无符号整数输入变量

我可以使用使用node.js创建的本地主机来存储我网站上提交的所有数据吗?没有SQL或任何数据库.只有HTML语言

material UI按钮组样式props 不反射

为什么我的getAsFile()方法返回空?

以Angular 实现ng-Circle-Progress时出错:模块没有导出的成员

在JS中动态创建对象,并将其追加到HTML表中

expo 联系人:如果联系人的状态被拒绝,则请求访问联系人的权限

删除元素属性或样式属性的首选方法

重新呈现-react -筛选数据过多

在高位图中显示每个y轴系列的多个值

AstroJS混合模式服务器终结点返回404

Refine.dev从不同的表取多条记录

暂停后只有一次旋转JS

如何使用Angular JS双击按钮