Consider one more time the following contract specification for the static metho
ID: 3858807 • Letter: C
Question
Consider one more time the following contract specification for the static method smooth.
/**
* Smooths a given {@code Sequence<Integer>}.
*
* @param s1
* the sequence to smooth
* @param s2
* the resulting sequence
*
* @replaces s2
* @requires |s1| >= 1
* @ensures <pre>
* |s2| = |s1| - 1 and
* for all i, j: integer, a, b: string of integer
* where (s1 = a * <i> * <j> * b)
* (there exists c, d: string of integer
* (|c| = |a| and
* s2 = c * <(i+j)/2> * d))
* </pre>
*/
public static void smooth(Sequence<Integer> s1, Sequence<Integer> s2) {...}
Provide two distinct implementations of the newly designed smooth method, one recursive and one iterative (i.e., not using recursion). Use only the SequenceKernel method methods (add, remove, and length, plus the methods listed there as inherited from Standard). [Sequence Kernel here: https://www.pdf-archive.com/2017/07/20/api/preview/page/1/]
Explanation / Answer
private static Sequence<Integer> smooth(Sequence<Integer> s1) {
Sequence<Integer> retSeq = s1.newInstance();
Sequence<Integer> copy = s1.newInstance();
for (int i : s1) {
copy.add(copy.length(), i);
}
if (s1.length() == 2) {
int firstElement = copy.remove(0);
int secondElement = copy.remove(0);
p("2 elements left, removing: " + firstElement + " and "
+ secondElement + ".");
retSeq.add(retSeq.length(), (firstElement + secondElement) / 2);
} else {
int firstElement = s1.remove(0);
int secondElement = copy.remove(1);
p("Removing: " + firstElement + " and " + secondElement + ".");
int firstSmoothed = (firstElement + secondElement) / 2;
int smoothedNumber = smooth(s1).remove(0);
p("Smoothed Number: " + smoothedNumber + ".");
s1.add(0, firstElement);
retSeq.add(0, firstSmoothed);
retSeq.add(retSeq.length(), smoothedNumber);
}
p("Returning: " + retSeq.toString());
return retSeq;
}
Method2:-
private static Sequence<Integer> smooth(Sequence<Integer> s1) {
Sequence<Integer> retSeq = s1.newInstance();
int tmp = 0;
int tmp2 = 0;
if (s1.length() == 2) {
tmp = s1.remove(0);
tmp2 = s1.remove(0);
retSeq.add(retSeq.length(), (tmp + tmp2) / 2);
} else {
int lastDigit = s1.remove(s1.length() - 1);
int nextDigit = s1.remove(s1.length() - 1);
retSeq.add(retSeq.length(), (lastDigit + nextDigit) / 2);
s1.add(s1.length(), nextDigit);
int test = smooth(s1).remove(0);
retSeq.add(retSeq.length(), test);
s1.add(s1.length(), lastDigit);
}
return retSeq;
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.