(Stack) Reemplaça 0s per suma per sota a posició parell X88008


Statement
 

pdf   zip   main.cc

html

Implementeu una funció RECURSIVA que, donada una pila de naturals, retorna una nova pila que és idèntica a la inicial, excepte que cada 0 s’ha reemplaçat per la suma dels elements a posició parell que apareixen per sota d’aquest 0 (en la pila original).

Sobreentenem que l’element del fons de la pila està a posició 0, el següent des del fons a posició 1, el següent des del fons a posició 2, i així successivament. Aquesta és la capcelera:

// Pre:  Sigui S el valor inicial de la pila s que es rep com a paràmetre.
//       Els valors guardats a S son majors o iguals a 0.
// Post: Sigui S' la pila retornada. S i S' tenen el mateix nombre d'elements.
//       A més a més, per a cada posició p de S', si S té un valor x diferent de 0 a posició p,
//       llavors S' també té x a posició p.
//       En canvi, si S té valor 0 a posició p, llavors el valor de S' a posició p és
//       la suma de tots els valors de S a posició parell per sota de p.
stack<int> replace0sWithBelowSumPosEven(stack<int> s);

Aquí tenim un exemple de comportament de la funció, a on les piles es representen tenint l’element del fons a l’esquerra i l’element del top a la dreta:

replace0sWithBelowSumPosEven([1 3 0 0 1 3 2 0 5 0 9]) = [1 3 1 1 1 3 2 4 5 9 9]

Observació Només cal enviar el procediment demanat; el programa principal serà ignorat.

Observació

La vostra funció i subfuncions que creeu han de treballar només amb piles. Heu de trobar una solució RECURSIVA i eficient del problema. En particular, no hi hauria d’haver cap bucle en cap de les funcions que implementeu. Si creeu funcions auxiliars, afegiu-hi les seves PRE/POST. En les crides recursives, incloeu la hipòtesi d’inducció, és a dir una explicació del que es cumpleix després de la crida, i també la funció de fita/decreixement o una justificació de perquè la funció recursiva acaba.

Una solució directa superarà els jocs de proves públics i us permetrà obtenir una nota raonable. Però molt possiblement serà lenta, i necessitareu crear alguna funció recursiva auxiliar per a produïr una solució més eficient capaç de superar tots els jocs de proves.

Avaluació sobre 10 punts:

  • Solució lenta: 6 punts.
  • Solució lenta + justificació: 8 punts.
  • solució ràpida: 8 punts.
  • solució ràpida + justificació: 10 punts.

Entenem com a solució lenta una que és correcta i capaç de superar els jocs de proves públics. Entenem com a solució ràpida una que és correcta i capaç de superar els jocs de proves públics i privats. La justificació val 2 punts i consisteix en definir correctament les PRE/POST de les funcions auxiliars que afegiu i en definir correctament les hipòtesis d’inducció i funcions de fita.

Sample session
replace0sWithBelowSumPosEven([1 0 8 4 2 5 0 6 7 8 9 7]) = [1 1 8 4 2 5 11 6 7 8 9 7]
replace0sWithBelowSumPosEven([9 5 2 1 4 4 8 8 1 3 5 3 0 0 2 9 1 6]) = [9 5 2 1 4 4 8 8 1 3 5 3 29 29 2 9 1 6]
replace0sWithBelowSumPosEven([7 0 7 9 4 3 1 1 7]) = [7 7 7 9 4 3 1 1 7]
replace0sWithBelowSumPosEven([7 0 7 9 4 3 2 7 1 2 1 3 0 0 2]) = [7 7 7 9 4 3 2 7 1 2 1 3 22 22 2]
replace0sWithBelowSumPosEven([6 7 8 8 0 2 0 2 5 1 7 4 0 5 8 4]) = [6 7 8 8 14 2 14 2 5 1 7 4 26 5 8 4]
replace0sWithBelowSumPosEven([0 3 3 4 9 3 0 8 0 0 7 6 0 7 3]) = [0 3 3 4 9 3 12 8 12 12 7 6 19 7 3]
replace0sWithBelowSumPosEven([9 2 0 5 5 8 9 1 5 8 3 2 0 4 9 0]) = [9 2 9 5 5 8 9 1 5 8 3 2 31 4 9 40]
replace0sWithBelowSumPosEven([4 6 4 7 3 8 9 6 0 5 1 1 1 4 0 9 2 0]) = [4 6 4 7 3 8 9 6 20 5 1 1 1 4 22 9 2 24]
replace0sWithBelowSumPosEven([0 0 3 4 7 8 1 3 9 6 5 5 9 0 0 5 0]) = [0 0 3 4 7 8 1 3 9 6 5 5 9 34 34 5 34]
replace0sWithBelowSumPosEven([0 0 8 7 0 2 3 7 6 0 9 7 0 9 9 2 3 0 8]) = [0 0 8 7 8 2 3 7 6 17 9 7 26 9 9 2 3 38 8]
Information
Author
PRO1
Language
Catalan
Official solutions
Unknown.
User solutions
C++