递归,而不是通过return语句结束递归

时间:2014-03-20 08:08:16

标签: recursion go

我正在这个树中进行二分查找,并且当结果为true时,期望Find递归结束。它确实有一个真实的结果,但即使它得到真值并运行return语句,它似乎继续运行并最终达到false的值

当找到值并返回时,如何使该程序结束?

http://play.golang.org/p/miWqRVo_XO

package main

import "fmt"

type Tree struct {
  Left  *Tree
  Value int64
  Right *Tree
}

func NewT(val int64) *Tree {
  return &Tree{
    Left:  new(Tree),
    Value: val,
    Right: new(Tree),
  }
}

func (T *Tree) Insert(val int64) *Tree {
  if T == nil {
    return &Tree{nil, val, nil}
  }
  if val < T.Value {
    T.Left = T.Left.Insert(val)
  } else {
    T.Right = T.Right.Insert(val)
  }
  return T
}

func (T *Tree) Find(val int64) bool {
  fmt.Printf("%v , %v\n", T.Value, val)
  fmt.Printf("%v\n", T.Value == val)

  if fmt.Sprintf("%v", T.Value) == fmt.Sprintf("%v", val) {
    fmt.Println("True and we do return true")
    return true
  }
  if val < T.Value {
    T.Left.Find(val)
  } else {
    T.Right.Find(val)
  }
  fmt.Println("False")
  return false
}

func main() {
  t1 := NewT(5)
  for i := 0; i < 10; i++ {
    t1 = t1.Insert(int64(i))
  }
  fmt.Println("Result:", t1.Find(7))
}

输出

5 , 7
false
0 , 7
false
5 , 7
false
6 , 7
false
7 , 7
true
True and we do return true

1 个答案:

答案 0 :(得分:4)

当你进入它时,你似乎忽略了Tree.Find的返回值。如果传递返回值,则应该获得所需的行为。也就是说,将Find的结尾修改为:

if val < T.Value {
    return T.Left.Find(val)
} else {
    return T.Right.Find(val)
}