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

Вы можете передать несколько возвращаемых значений с помощью go. Просто измените свою подпись функции, чтобы выглядеть как 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' и stick '1 ++' в верхней части цикла for. Это не повлияет на результат, просто стиль. – Snowman

+0

Неужели вы не думаете, что положить целое число итераций в цикле if было бы лучше, потому что тогда вы бы знали, сколько итераций уменьшило имеющееся у вас значение, а не только для итераций цикла? Кроме того, начиная с 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

Удивительный, спасибо! Я писал код так же, как вы пишете комментарий, и мы придумали ту же реализацию. Mine немного дерьмо, хотя, потому что я сначала инициализировал переменные внутри выходной функции, а затем назначил им вывод моей вычислительной функции. – Arthmost

Смежные вопросы