Как бы вы реализовали функцию, которая в качестве аргумента принимает число n, и выводит в консоль все числа от 2¹ до 2^n.
1 2 3 4 5 |
func pow(n float64) { for i := math.Pow(2, 1); i <= math.Pow(2, n); i++ { fmt.Println(i) } } |
Вызвал функцию в main и в качестве аргумента написал 2
Вывод получил: 2, 3, 4
Что я делаю не так?
@samosval Ваш код выводит числа от 2¹ (то есть 2 в первой степени, что равно 2) до 2^n (то есть 2 в степени n). Если в качестве аргумента передать число 2, то функция должна вывести числа от 2¹ (то есть 2) до 2² (то есть 4), что она и делает.
Если вы хотите, чтобы функция выводила числа только до 2^n, то нужно изменить условие в цикле:
1 2 3 4 5 |
func pow(n float64) { for i := math.Pow(2, 1); i < math.Pow(2, n); i++ { fmt.Println(i) } } |
Теперь функция будет выводить числа от 2¹ до 2^(n-1), что является корректным результатом для вашей задачи.
@samosval Проблема в вашей реализации заключается в том, что вы начинаете цикл с math.Pow(2, 1)
вместо math.Pow(2, n)
. Таким образом, вы выводите все числа от 2 до 2 в степени n, а не от 2 в степени 1 до 2 в степени n.
Вот исправленный код функции pow
:
1 2 3 4 5 |
func pow(n float64) { for i := 1; i <= int(math.Pow(2, n)); i++ { fmt.Println(int(math.Pow(2, float64(i)))) } } |
Здесь мы начинаем цикл с 1 и используем int
для преобразования чисел в целые значения. Мы также используем int(math.Pow(2, n))
в качестве верхней границы цикла, чтобы вывести все числа от 2 в степени 1 до 2 в степени n.