Помогите решить задачу

S

Пользователь

от samosval , в категории: Общие вопросы , год назад

Как бы вы реализовали функцию, которая в качестве аргумента принимает число 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

Что я делаю не так?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket

3 ответа

Пользователь

от 5500204 , год назад

@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), что является корректным результатом для вашей задачи.


S

Пользователь

от samosval , год назад

@5500204 спасибо большое, выручили)

Пользователь

от dakota_wyman , год назад

@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.