Los casos de negativo son más fáciles, pero necesito evitarlos por ahora. Por eso el valor "parado" acá es 11.
Un valor negativo deja de serlo cuando se le suma un valor igual. Si a toda la serie se le suma el mínimo alcanzable, el resultado es equivalente... es como mover un grafico en la pantalla verticalmente, la forma dle gráfico, no cambia solo su posición en él.
El puntó máximo o mínimo eso es cosa del valor que se le pase a la función. Si le pasas 5, 5 será el máximo, si le pasas 387 ese será el máximo, si necesitas 11, pués pasa ese valor. esto no debería ser preciso de explicar ni siquiera objeto de discusión.
La salida debe ser 20, 1, 19, 2...
X, Y, X-1, Y+1, X-2, Y+2...
Entonces es la serie del ejemplo 3... aplicando lo antedicho en el párrafo previo sobre los negativos:
Te ponía esta salida, para C:
12 -11 10 -9 8 -7 6 -5 4 -3 2 -1
Como no se quieren valores negativos, y el maximo es 12, el mínimo será a lo sumo -11, luego basta sumar a todos +11, por comodidad puede dar igual sumar +12
12+12; -11+12; 10+12; -9+12; 8+12... etc... -1+12
resultando:
24 1 22 3 20 ... 11
como se puede ver, no es exactamente el resultado esperado, salta de 2 en 2 en vez de 1 en 1,
// basta tocar un poco la función y cambiar solo la línea:
Max = -(Max + razon)
// por esta otra, para que en cada ciclo solo descuente 1
Max = -(Max + 0)
Y la salida será (cambiando a 10 como el valor máximo):
1: 10 -9 9 -8 8 -7 7 -6 6 -5 5 -4 4 -3 3 -2 2 -1
Eliminando números negativos:
2: 20 1 19 2 18 3 17 4 16 5 15 6 14 7 13 8 12 9
Con una ligera modificación para que ascienda nuevamente hasta el tope:
3: 20 1 19 2 18 3 17 4 16 5 15 6 14 7 13 8 12 9 11 10 10 11 9 12 8 13 7 14 6 15 5 16 4 17 3 18 2 19
El pseudocodigo sería (compara los cambios con el previo):
Funcion Pendular3(entero Max, buleano NoNegativos)
entero razon, pos, value
si NoNegativos = True
pos = Max
fin si
value = (Max + pos)
razon = 1
Hacer mientras (value > razon) // caso 3, ó (Max > razon) para un rango más corto (caso 2).
imprimir value // cualquier acción posterior
Max = -(Max - razon)
value = (Max + pos)
imprimir value // cualquier acción posterior
Max = -(Max + 0) // + razon)
value = (Max + pos)
repetir
fin funcion
el resultado de este código es, el último dado:
20 1 19 2 18 3 17 4 16 5 15 6 14 7 13 8 12 9 11 10 10 11 9 12 8 13 7 14 6 15 5 16 4 17 3 18 2 19
Está quieto pero alguien lo agarró, llevó el peso, el coso colgante, al extremo, y entonces ahora se va frenando de a poco. Empezó en el punto 20 y llega al -20, luego al 19...
Algo así. Que pierda velocidad sólo de un lado es una asunción, propuesta, imaginación.
No tengo mucha idea, este simplemente frena. Como una hamaca, la empujas y luego de a poco frena.
No sé bien de qué hablas... No creo que esto requiera realismo, sólo que un valor vaya de extremo a extremo pero cada vez que vaya a volver a uno se quede un poco atrás.
Una serie aritmética o progresión aritmética, es basicamente una línea recta, imagina puntos, se salta de un punto a otro siempre a íntérvalos iguales, llamados razón.
La progresión aritmética es una suma:
Dados un término inicial y final, y pedidos 'x' puntos intermedios entre ellos, se define la razón como:
razon = (maximo - minimo) /(x+1)
ejemplo, sea el máximo 30, el mínimo 10 y los puntos intermedios 3:
razon = (30-10)/ (3+1) = 20/4 = 5.
siendo el valor inicial 10, los siguientes 3 intermedios serán: 15, 20, y 25 y el final es 30.
La serie aritmética es tremendamente fácil, tanto que no es preciso hacer cuentas, se hace de cabez salvo que se trate de numeros grandes con decimales etc..., o se trate de hallár el enésimo miembro de la serie...
así: 2,4,6, 8, 10, 12... la razón es 2.
0.3, 0.7, 1.1, 1.5 ... la razón es 0.4
23,30,37,44,51... la razón es 7
La series geométricas tienen exactamente las mismas fórmulas que la sritmética, con uns simple salvedad (remplazo)... donde las fórmulas de las series aritméticas son sumas, en la geométrica son multiplicaciones, donde restas, divisiones, donde multiplica, potencia, donde divide, raíz. Y entonces todo lo dicho para una vale para la otra.
Por eso, es bueno empezar primero dominando las series aritméticas que son muy asequibles... y luego con esa pequeña aclaración es tremendamente fácil asumir las progresiones geométricas.
Las series geométricas, dibujan curvas... en tu caso que es pendular implica que un lado es casi o cuasi espejo un lado respecto del otro.
sea el valor inicial 10 y el final 90 y se quiera 6 medios interpolados... (6 puntos entre medias) la razón vendrá dada por la fórmula:
razon = raiz (x+1) de (max/min)= sq7(90/10) = 1.3687
valores de la serie: el valor inicial: 10 los 6 interpolados entre dicha distancia: 13.68738 18.73444 25.64254 35.09792 48.03986 65.75398 y el máximo: 89.99998
es decir 10 se multiplica por la razon 10 * 1.3687 = 13.68...
el siguiente término se consige multiplicando el obtenido por la razón y así sucesivamente... es un bucle con el número de términos a iterar que se precisan....
Tomando un ejemplo más pequeño: minimo 1, máximo = 20, con 15 puntos entre medias:
Valores de la serie: 1 1.205909 1.454215 1.753651 2.114743 2.550186 3.075291 3.70852 4.472136 5.392987 6.503449 7.842565 9.457416 11.40478 13.75312 16.585 20
Si uno se dedica a programar, no le bastan las 4|6 operaciones fundamentales de las matemáticas, debe dominar al menos las series, logarítmos y algunas cosas mas... es como si un taxista no supiera para que sirve el cambio de marchas.
Adjunto un par de imágenes para que se vea la diferencia entre ambas series:
Serie aritmética:
Serie geométrica, mismos valores usados en la serie aritmética:
Nota que la gráfica se crea tomando los valores dados como puntos para un eje, el otro eje asume los valores del orden que ocupa cada término, 0,1,2,3,4...
Juega con los signos para orientar a derecha/izquierda, arriba/abajo el resultado del gráfico.
Terminar de ajustar el código a los valores precisos que tu necesitas es algo que te corresponde a ti. Haz las modificaciones oportunas una vez lo entiendas.