Привет, Обновление: спасибо за все ваши предложения
если предположить, что это упражнение похоже на ребус, У меня есть список чисел, составленный с концепцией Cons и Nil,
List l = new Cons(**3**, new Cons(**2**,new Cons(**1**, new
Cons(**4**, new Cons(**1**, new Nil())))));
и я хочу рекурсивно подсчитать, за сколькими из них сразу следует меньшее число.
Например
[5,0,5,3].count() == 2, [5,5,0].count() == 1
Метод count()
сделан мной (у него не может быть никаких параметров), остальное по умолчанию, и я не могу сделать и другой метод или использовать уже определенные, такие как add(),size()...
"NEXT" должно иметь следующее значение после текущего элемента, но я не могу найти решение.
Любые решения приветствуются.
abstract class List {
public abstract boolean empty();
public abstract int first();
public abstract int count();
}
class Cons extends List {
private int elem;
private List next;
public Cons(int elem, List next) {
this.elem = elem;
this.next = next;
}
public boolean empty(){
return false;
}
public int first(){
return elem;
}
@Override
public int count() {
if (elem>NEXT) {
return 1 + next.count();
}else {
return next.count();
}
}
```
Потому что List — это тип, созданный для этого упражнения, а не существующий. Кроме того, в тексте упражнения сказано, что вы не можете добавлять дополнительные методы.
Хорошо, я понимаю, вы можете взглянуть на мой ответ и посмотреть, соответствует ли он вашим требованиям. Что касается ограничения на создание методов, вам не разрешено создавать новые абстрактные методы или любые методы вообще? Если это так, то мне нужно будет переосмыслить свой подход.
В тексте упражнения сказано: è vietato usare cast o definire altri metodi oltre a quelli presenti. L'invocazione del metodo count non deve modificare in alcun modo la lista L, что в переводе с итальянского означает: запрещено использовать приведение или определять другие методы, кроме существующих. Вызов метода count не должен каким-либо образом изменять список L.
Есть полное упражнение imgur.com/a/SKBv2RT
Я предполагаю, что включение новых конструкторов также будет считаться нарушением ограничений упражнений. Я посмотрю, что я могу сделать, чтобы он не реализовывал какие-либо методы или конструкторы, кроме тех, которые уже объявлены.
Это университетский тест, так что не ломайте над ним голову :P
Да, не беспокойтесь, это глупо, что вам не разрешено делать свою собственную реализацию, вам разрешено делать это только так, как задумал универ. Это не очень хороший урок для будущего программиста, так как вас часто призывают работать нестандартно и находить уникальные способы повышения производительности, стабильности и в целом реализации ваших собственных идей.
Вам хотя бы разрешено объявлять поля внутри существующих классов? Также вам разрешено создавать свои собственные классы? Это сделало бы вещи намного проще.
Честно говоря, я не думаю, что это возможно даже с наложенными на вас ограничениями. Моя текущая мысль состоит в том, чтобы использовать отражение, но это будет связано с внешними библиотеками, которые, я снова предполагаю, вам не разрешено использовать: D
Я обновил свой ответ, чтобы предоставить фактический ответ, который вы искали, который является решением упражнения, которое вы указали выше. Он должен работать в рамках ограничений, наложенных на вас, попробуйте и скажите мне, если он каким-то образом не работает.
Вы гений! Большое вам спасибо, ваше решение делает именно то, что оно должно делать правильно. Я никогда не думал о том, что я должен использовать конструктор try and catch, более того, то, как вы сравниваете элемент со следующим, это просто, но не так очевидно. А насчет того, что ты сказал, что это не очень хороший урок — использовать только то, что университет хочет, чтобы ты использовал..; это так правильно, что я клянусь, что скажу это профессору. Извините, но я не могу проголосовать за вас (у меня слишком низкая репутация) еще раз спасибо
Однако вы можете принять ответ, он пометит вопрос как действительно отвеченный и поможет другим, которые ищут аналогичные реализации, сообщив им, что ответ работает. Кроме того, это избавит модераторов от необходимости очищать вопрос позже из-за того, что он неактивен, остается без ответа и практически мертв. Подробнее читайте здесь: meta.stackexchange.com/a/5235/541613
public int NEXT(){
if (next!=null)
return next.first()
else
throw new Exception("No next element")
}
Следующий код создаст рекурсивный список с элементами Н со значением Н, определяемым размером количества элементов, найденных в массиве int
, называемом elements
в классе RecursiveList
. Вызовите метод startRecursion()
, чтобы создать рекурсивный список с определенными элементами, и вызовите count()
, чтобы получить количество элементов в массиве, которые равны сразу же следует меньшее число.
Основной класс
Это ваша точка входа в приложение:
public static void main(String[] args) {
int count = RecursiveList.startRecursion().count();
System.out.printf("List has %d recursive elements", count);
}
Класс рекурсивлист
abstract class RecursiveList {
protected static int index = -1;
protected static int[] elements = new int[]{ 5,2,1,4,3,2,6 };
public static RecursiveList startRecursion() {
return new Cons();
}
public abstract boolean empty();
public abstract int count();
public abstract Integer getElement();
public static int incIndex() {
return index += 1;
}
}
Минусы Класс
public class Cons extends RecursiveList {
private static int result;
private final Integer elem;
private final RecursiveList prev;
private final RecursiveList next;
private Cons(Cons parent) {
prev = parent;
elem = incIndex() < elements.length ? elements[index] : null;
System.out.printf("Creating new Cons with element %d(%d)%n", elem, index);
next = elem != null ? new Cons(this) : null;
}
Cons() {
this(null);
}
public boolean empty() {
return false;
}
@Override
public /*@Nullable*/ Integer getElement() {
return elem;
}
@Override
public int count() {
if (elem != null)
{
if (prev != null && elem < prev.getElement())
result += 1;
if (next != null) {
return next.count();
}
}
return result;
}
}
РЕДАКТИРОВАТЬ
Хорошо, вот ответ, который вы на самом деле искали. Это полностью соответствует ограничениям, наложенным на упражнение это, которое вы предоставили. Решение использует чистую Java, ни класс, ни его методы или объявления полей не были изменены каким-либо образом, и такие новые элементы не были добавлены. Я добавил реализацию только там, где в упражнении указано, что вы должны это сделать.
Основной класс
public static void main(String[] args) {
List l = new Cons(3, new Cons(2,new Cons(1, new
Cons(4, new Cons(1, new Nil())))));
assert l.count() == 3;
l = new Cons(5, new Nil());
assert l.count() == 0;
l = new Cons(5, new Cons(5, new Cons(0, new Nil())));
assert l.count() == 1;
l = new Cons(5, new Cons(0, new Cons(5, new Cons(3, new Nil()))));
assert l.count() == 2;
System.out.println("All tests completed successfully!");
}
Минусы Класс
import java.util.NoSuchElementException;
public class Cons extends List {
private int elem;
private List next;
public Cons(int elem, List next) {
this.elem = elem;
this.next = next;
}
public boolean empty()
{ return false; }
public int first()
{ return elem; }
public int count()
{
try {
if (first() > next.first()) {
return 1 + next.count();
}
else return next.count();
}
catch (NoSuchElementException e) {
return 0;
}
}
}
Нулевой класс
import java.util.NoSuchElementException;
public class Nil extends List {
public boolean empty()
{ return true; }
public int first()
{ throw new NoSuchElementException(); }
public int count()
{
throw new IllegalAccessError();
}
}
Почему именно вы не можете использовать
List
методы, такие какadd()
иsize()
?