Функция Коллатца

Функция Коллатца http://en.wikipedia.org/wiki/Collatz_conjecture является функцией, которая принимает нечетное положительное целое число n в 3 * n + 1 и четное положительное целое число n в n / 2. Он рекурсивный, поэтому предыдущее значение функции является входом для следующего значения функции. Гипотеза Коллатца гласит, что независимо от того, какое начальное число (конечное), будет конечное число рекурсий, пока функция сначала не примет значение 1. Это количество рекурсий называется временем остановки исходного значения.

Я хочу произвести время остановки для начальных значений от 1 до 1000. С выводом на печать «Значение остановки для i равно _» для 1<= я<= 1000. Вот мой неудачный код для определения времени остановки для начальных значений от 2 до 1000:

#include <iostream>
using namespace std;

int main()
{
for(long c=2, c<=1000; c++) // define stopping value as 0 for c=1 elsewhere
{
long count=0;

while (c!=1)
{
if((c%2)==0)
{
c/=2;
}
else
{
c=3*c+1;

}

count ++;
}cout << "The stopping value for " << c << " is " << count << endl;

}

return 0;
}

Я знаю, почему этот цикл for терпит неудачу, поскольку c становится 1 в цикле while. Есть ли способ избежать этого, чтобы получить правильный результат?

Любая помощь приветствуется.

0

Решение

Я вижу синтаксическую ошибку в приведенном выше коде: есть , внутри цикла, где должен быть ;,

Как вы заметили, главная проблема заключается в том, что c переменная сбрасывается в 1 каждый раз, когда выполняется цикл while.

Вероятно, самым лучшим решением было бы поместить код для определения значения остановки в отдельную функцию, а затем передать переменную вашего итератора. например

long stoppingValue(long c)
{
long count=0;

while (c!=1)
{
...
}
return count;
}

for(long c=2; c<=1000; c++)
{
cout << "The stopping value for " << c << " is " << stoppingValue(c) << endl;
}

В качестве альтернативы вы можете найти новое имя для вашей переменной итератора или вашей рабочей переменной и установить рабочую переменную равной итератору в начале тела цикла for.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector