2016-06-09 129 views
0

因此,我有这样一小段代码,只要需要迭代,直到找到的值之间的差异很大。我想在代码完成运行后计算并打印迭代次数,最好是在我的主函数中(以及打印所需的其他所有内容)。如何计算Go的迭代次数?

编辑:好吧,我已经设法做到这一点。我想知道是否有更简单的迭代计数方法并将它们传递给输出函数。

func sqrt(x float64) (float64, int) { 
    k := 1 
    z := 1.0 
    q := (z*z - x)/(2*z) 
    for { 
     if math.Abs(-q) > 0.001 { 
     z -= q 
     q = (z*z - x)/(2*z) 
     k += 1 
     } else { 
     break 
     } 
    } 
    return z, k 
} 

func main() { 
    k := 1 
    z := 1.0 
    z, k = sqrt(9) 
    fmt.Println("Your sqrt = ", z) 
    fmt.Println("Math Sqrt = ",math.Sqrt(9)) 
    fmt.Println("Iterations: ", k) 
} 
+0

您可以传递多个返回值。简单地改变你的函数签名看起来像func sqrt(x float64)(float64,int){} –

+0

@ william.taylor.09最后我返回z,k而不是z如果k是我的整数的名字?我如何分开打印?我用我的原始输出更新了我的文章。 – Arthmost

+0

查看回答发布如下 –

回答

1

您可以返回你的浮点值和int(如迭代次数)。我对你的例子进行了非常小的修改来证明。

func sqrt(x float64) (float64, int) { 

    z := 1.0 
    i := 1 
    q := (z*z - x)/(2 * z) 
    for { 
     if math.Abs(-q) > 0.01 { 
      i++ 
      z -= q 
      q = (z*z - x)/(2 * z) 
     } else { 
      break 
     } 
    } 
    return z, i 
} 

func main() { 
    f, i := sqrt(9) 
    fmt.Printf("result: %f iterations: %d\n", f, i) 
    fmt.Println(math.Sqrt(9)) 
} 
+0

谢谢你,你基本上覆盖了我原来的问题和我在对方帮助我完成函数输出(传递和分离最终输出值)之后的那个问题。 我看到我已经犯了一个错误,把迭代计数整数在if循环。我想知道这个练习中是否还有别的东西可以做得更好。 – Arthmost

+0

我会做一些不同的事情:把'return z,i'移到'else'分支,然后你不需要'break',声明'var i int'而不是'i:= 1'和在for循环的顶部粘贴'1 ++'。这不会影响产出,只是风格。 – Snowman

+0

你不觉得把迭代计数器整数放在if循环中会更好吗,因为那么你会知道减少了你的值的迭代次数,而不仅仅是for循环迭代?另外,从0开始,而不是从1开始。 – Arthmost

1

您可以通过函数提供多个返回值:

func main() { 
    numLoops, newNum := sqrt(9) 
} 

func sqrt(x float64) (int, float64) { 
    <implementation> 
} 

GoPlay这里:https://play.golang.org/p/R2lV41EbEd

+1

真棒,谢谢!我正在编写代码,就像编写评论时一样,我们提出了相同的实现。虽然我的内容有些低劣,因为我首先初始化了输出函数中的变量,然后为它们分配了我的计算函数的输出。 – Arthmost