Я работаю над программой последовательности градин, в которой пользователь выбирает положительное целое число. Если число четное, оно будет разделено на два. Если число нечетное, оно будет умножено на три и добавлено к единице. Программа будет продолжаться до тех пор, пока число не станет равным 1. Программа также сообщит пользователю количество шагов, которое потребовалось для достижения 1.
Цель состоит в том, чтобы сделать это рекурсивно, моя проблема в том, что я не могу объявить каждый шаг пользователю, поскольку вычисление происходит с числом, например, «число, поэтому я делю на 2, и это =»
Пока это мой код, любые предложения или альтернативы помогут.
Спасибо
import javax.swing*
{
public class hailstone {
static int Count;
static int HailstoneNumbers(int Num)
output += (Num + " " ) ;
JOptionPane.showMessageDialog(null, output);
if (Num == 1 && Count == 0) {
return Count;
}
else if (Num == 1 && Count != 0) {
//n-1
Count++;
return Count;
}
else if (Num % 2 == 0) {
Count++;
HailstoneNumbers(Num / 2);
}
else if (Num % 2 != 0) {
Count++;
HailstoneNumbers(3 * Num + 1);
}
return Count;
}
public static void main(String[] args)
{
int Num = Integer.parseInt(JOptionPane.showInputDialog("\n Enter a positive number"));
int x;
x = HailstoneNumbers(Num);
JOptionPane.showMessageDialog(null, "Number of Steps" + x );
}
}
Вы звоните HailstoneNumbers(Num / 2);
. Если вы хотите сделать это рекурсивно, функция должна возвращать себя на каждом шаге, например return HailstoneNumbers(Num / 2);
. Кроме того, если вы изменяете глобальную переменную, рекурсивность бессмысленна. Вот пример:
int hailstone(int i, int steps) {
steps++;
if (i == 1) return steps;
if (i % 2 == 0) return hailstone(i / 2, steps);
else return hailstone(i * 3 + 1, steps);
}
// main function
x = hailstone(num, 0);
Обратите внимание, что по соглашению функции и переменные не должны начинаться с заглавной буквы, если только они не final
.
Другое решение. Упрощено, поместив оператор печати в метод. Кроме того, пользователю не нужно беспокоиться об инициализации счетчика шагов, поэтому я перегрузил метод collatz
. Примечание. Официальное название этого метода — Collatz Conjecture
, поэтому я назвал методы соответственно.
public int collatz(int v) {
return hail(v, 0);
}
private int collatz(int v, int count) {
System.out.println(v);
if (v != 1) {
return hail((v & 1) == 1 ? v * 3 + 1
: v / 2, count + 1);
}
return count;
}