2016-06-09 107 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

相關問題