;porRBJJCMGCEP.
;FUNCIONESLOGICASYMATEMATICAS
;Distinto
;Ej:(!=33)=>#f(!=36)=>#t
(define!=(lambda(N1N2)(not(=N1N2))))
;Ej:(notnull?4)=>#t(notnull?'())=>#f
(definenotnull?(lambda(E)(not(null?E))))
;Incrementa1
;Ej:(++1)=>2
(define++(lambda(N)(+N1)))
;Decrementa1
;Ej:(1)=>0
(define(lambda(N)(N1)))
;Par(seasumequeel0esnumeropar)
;Ej:(par?4)=>#t(par?7)=>#f
(definepar?(lambda(N)
(if(<N0)(parAux(*N1))(parAuxN))))
(defineparAux(lambda(N)
(if(=N0)#t(impar?(N1)))))
;Impar
;Ej:(impar?5)=>#t
(defineimpar?(lambda(N)
(if(<N0)(imparAux(*N1))(imparAuxN))))
(defineimparAux(lambda(N)
(if(=N0)#f(par?(N1)))))
;Potencia
;Ej:(potencia28)=>256
(definepotencia(lambda(BE)
(cond((=E0)1)
((=E1)B)
(else(*B(potenciaB(E1)))))))
;Calcularfactorial(2versiones)
;Ej:(factorial6)=>720
(definefactorial(lambda(N)(if(=N0)1(*N(fact1(N1))))))
;TRABAJOSCONLISTAGENERALIDADES
;Devuelveelnumerodeelementosquecomponeunalista.
;Ej:(long'(1234))=>4(long'(12(34)))=>3
(definelong(lambda(L)
(if(null?L)0(+1(long(cdrL))))))
;Devuelveelnumerodeelementos(atomos)quecomponeunalista.Multinivel.
;Ej:(longM'(1234))=>4(longM'(12(34)))=>4
(definelongM(lambda(L)
(long(listaAtomosL))))
;Devuelveelmaximoelementodeunalista.
;Ej:(maxL'(123456))=>6
(definemaxL(lambda(L)
(if(null?L)'()
(if(null?(cdrL))(carL)
(if(>=(carL)(maxl(cdrL)))(carL)
(maxl(cdrL)))))))
;Devuelveelmaximoelementodeunalista.Multinivel.
;Ej:(maxM'(123(456)(78)4(102)))=>10
(definemaxM(lambda(L)
(if(null?L)'()
(if(null?(cdrL))
(if(list?(carL))(maxM(carL))(carL))
(if(>(if(list?(carL))(maxM(carL))(carL))(maxM(cdrL)))
(if(list?(carL))(maxM(carL))(carL))
(maxM(cdrL)))))))
;Devuelveelmenorelementodeunalista.
;Ej:(minL'(123456))=>1
(defineminL(lambda(L)
(if(null?L)'()
(if(null?(cdrL))(carL)
(if(<=(carL)(minl(cdrL)))(carL)(minl(cdrL)))))))
;Devuelveelmenorelementodeunalista.Multinivel.
;Ej:(minM'(123(456)(78)4(1022)))=>2
(defineminM(lambda(L)
(if(null?L)'()
(if(null?(cdrL))
(if(list?(carL))(minM(carL))(carL))
(if(<(if(list?(carL))(minM(carL))(carL))(minM(cdrL)))
(if(list?(carL))(minM(carL))(carL))
(minM(cdrL)))))))
;Determinasiunalistaesestrictamentecreciente.
;Ej:(crece'(1234567))=>#t
(definecrece(lambda(L)
(if(null?(cdrL))#t
(if(<(carL)(cadrL))(crece(cdrL))#f))))
;Determinasiunalistaesestrictamentedecreciente.
;Ej:(decrece'(76543))=>#t
(definedecrece(lambda(L)
(if(null?(cdrL))#t
(if(>(carL)(cadrL))(decrece(cdrL))#f))))
;Verificasiunalistaescapicua
;Ej:(capicua'(135(246(8)642)531))=>#t
;(capicua'(135(246(8)742)531))=>#f
(definecapicua(lambda(L)
(if(null?L)#t
(if(equal?L(invertirML))#t#f))))
;L1esprefijodeL2?,nopuedenestarambasvacias
;Ej:(prefijo'(12)'(12345))=>#t
(defineprefijo(lambda(L1L2)
(if(null?L2)#f(if(or(null?L1)(equal?L1L2))#t(prefijoL1(quL2))))))
;Version2
(defineprefijo2(lambda(L1L2)
(if(equal?L1L2)#t(if(<(longL2)(longL1))#f(prefijo2L1(quL2))))))
;L1esposfijodeL2?
;Ej:(posfijo'(76)'(126576))=>#t
(defineposfijo(lambda(L1L2)
(if(null?L2)#f
(if(equal?L1L2)#t(posfijoL1(cdrL2))))))
;Version2
(defineposfijo2(lambda(L1L2)
(if(or(null?L1)(equal?L1L2))#t
(if(<(longL2)(longL1))#f(posfijo2L1(cdrL2))))))
;sublista!!L1deL2,nopuedenestarambasvacias
;Ej:(subLista'(123)'(3512378))=>#t
(definesubLista(lambda(L1L2)
(if(null?L2)#f
(if(prefijoL1L2)#t
(sublistaL1(cdrL2))))))
;subListaM!!L1essublistadeL2?Multinivel
;Ej:(subListaM'(357)'(123(76(3571)(23))2))=>#t
(definesubListaM(lambda(L1L2)
(if(not(list?L2))#f
(if(equal?L1L2)#t
(if(null?L2)#f
(or(subListaML1(cdrL2))(subListaML1(quL2))(subListaML1(carL2))))))))
;DeterminasilosvaloresXeYsonconsecutivoenL
;Ej:(consecutivo'(12345678)67)=>#t
(defineconsecutivo(lambda(LXY)
(sublista(listXY)L)))
;ConsecutivosMultinivel.
;Ej:(consecutivoM'(123(4(56))78)56)=>#t
(defineconsecutivoM(lambda(LXY)
(subListaM(listXY)L)))
;BUSQUEDADEELEMENTOS
;Obtenerelultimoelementodeunalista.
;Ej:(ultimoElem'(123456))=>6
(defineultimoElem(lambda(L)
(if(null?L)'()(if(equal?(cdrL)'())(carL)(ultimoElem(cdrL))))))
;Devuelveelenesimoelementodeunalista.
;Ej:(enesimoElem10'(78910))=>0(enesimoElem2'(78910))=>8
(defineenesimoElem(lambda(NL)
(if(<(longL)N)0
(if(equal?N1)(carL)
(enesimoElem(N1)(cdrL))))))
;DevuelveelnumerodeposiciondelaprimeraocurrenciadeX.
;Ej:(xPosicion2'(2345))=>1
(definexPosicion(lambda(XL)
(if(or(null?L)(not(perteneceXL)))0
(xBuscaXL))))
(definexBusca(lambda(XL)
(if(null?L)0
(if(equal?(carL)X)1
(+1(xBuscaX(cdrL)))))))
;DadounvalorX,buscaenunalistaL(simple)paradeterminarsiestaonoenella.
;Ej:(pertenece3'(123456))=>#t
(definepertenece(lambda(XL)
(if(null?L)#f(if(equal?(carL)X)#t(perteneceX(cdrL))))))
;DadounvalorX,buscaenunalistaLparadeterminarsiestaonoenella.Multinivel.
;Ej:(perteneceM3'(1(23)4(56)))=>#t
(defineperteneceM(lambda(XL)
(if(null?L)#f
(if(list?(carL))(perteneceMX(carL))
(if(equal?X(carL))#t
(perteneceMX(cdrL)))))))
;ELIMINACIONOREEMPLAZOSDELOSELEMENTOSENUNALISTA
;Noeliminaelnesimoelemento,sisuspredecesores.
;Ej:(sacaNpri3'(111345))=>(345)
(definesacaNpri(lambda(NL)
(if(=0N)L
(sacaNpri(N1)(cdrL)))))
;EliminaelelementoXdelalistaenel1ernivel.
;Ej:(eliminaX3'(345(37)3))=>(45(37))
(defineeliminaX(lambda(XL)
(if(null?L)'()
(if(equal?X(carL))
(eliminaXX(cdrL))
(cons(carL)(eliminaXX(cdrL)))))))
;EliminaelelementoXdelalistaentodoslosniveles
;Ej:(eliminaMx'((123)27(13(628)02))2)=>((13)7(13(68)0))
(defineeliminaMx(lambda(LX)
(if(null?L)'()
(if(equal?(carL)X)(eliminaMx(cdrL)X)
(if(list?(carL))(cons(eliminaMx(carL)X)(eliminaMx(cdrL)X))
(cons(carL)(eliminaMx(cdrL)X)))))))
;Eliminatodosloselementosdelalista2queestanenla1
;Ej:(elim12'(21)'((123)27(13(628)02)))=>((3)7(3(68)0))
(defineelim12(lambda(L1L2)
(if(null?L1)L2
(elim12(cdrL1)(eliminaMxL2(carL1))))))
;Devuelvelalistasinelementosrepetidos.Eliminalasprimerasocurrencias.
;(eliminaR'(3531923893))=>(512893)
(defineeliminaR(lambda(L)
(if(null?L)'()
(if(not(pertenece(carL)(cdrL)))
(cons(carL)(eliminaR(cdrL)))
(eliminaR(cdrL))))))
;Devuelvelalistasinelementosrepetidos.Dejalasprimerasocurrencias.
;(eliminaR2'(3531923893))=>(351928)
(defineeliminaR2(lambda(L)
(if(null?L)'()(invertir(eliminaR(invertirL))))))
;EliminaelprimerelementoXqueapareceenlalista.
;Ej:(eliminarPri2'(42121))=>(4121)
(defineeliminarPri(lambda(XL)
(if(null?L)'()
(if(equal?(carL)X)(cdrL)
(cons(carL)(eliminarPriX(cdrL)))))))
;Eliminaelelementoqueseencuentraenlaenesimaposicion.
;Ej:(xElimina'(4891275)3)=>(48275)
(definexElimina(lambda(LN)
(if(or(null?L)(>N(longL)))#f
(if(=N1)(cdrL)
(cons(carL)(xElimina(cdrL)(N1)))))))
;ReemplazarXporYenL
;Ej:(xReemplazar'(potencia)'t'n)=>(ponencia)
(definexReemplazar(lambda(LXY)
(if(null?L)'()
(if(equal?(carL)X)(consY(xReemplazar(cdrL)XY))
(cons(carL)(xReemplazar(cdrL)XY))))))
;ReemplazarXporYenL(multinivel)
;Ej:(xReemplazarM23'(21(12(22622)313)25))=>(31(13(33633)313)35)
(definexReemplazarM(lambda(XYL)
(if(null?L)'()
(if(list?(carL))(cons(xReemplazarMXY(carL))(xReemplazarMXY(cdrL)))
(if(equal?X(carL))
(consY(xReemplazarMXY(cdrL)))
(cons(carL)(xReemplazarMXY(cdrL))))))))
;EJERCICIO29:SustituirenLP1porP2(P1yP2sonlistas,patrones).
;Ej:(sust'(1234)'(12)'(4))=>(434)
(definesust(lambda(LP1P2)
(if(null?L)'()
(if(prefijoP1L)
(concatenarP2(sust(aPartirN(longP1)L)P1P2))
(cons(carL)(sust(cdrL)P1P2))))))
;QuitaelultimoElemelementodeunaL,siesvaciaretorna'()
;Ej:(qu'(12345))=>(1234)
(definequ(lambda(L)
(if(null?L)'()(if(equal?'()(cdrL))'()(cons(carL)(qu(cdrL)))))))
;ConstruyeunalistaconelprimeryultimoElemelementodeunalista.
;Ej:(leex'(12345))=>(15)
(defineleex(lambda(L)(list(carL)(ultimoElemL))))
;Quitalosextremosdeunalista.
;Ej:(quitaex'(12345))=>(234)
(definequitaex(lambda(L)
(if(>(longL)1)(qu(cdrL))'())))
;ReemplazaelelementoenlaposicionNporX.
;Ej:(insertarXenN'(13274)25)=>(1574)
(defineinsertarXenN(lambda(LNX)
(if(or(null?L)(=N0))L
(if(=N1)(consX(cdrL))
(cons(carL)(insertarXenN(cdrL)(N1)X))))))
;CREACIONDELISTAS
;Dadadoslistas,L1yL2,lasconcatena.
;Ej:(concatenar'(12)'(345))=>(12345)
(defineconcatenar(lambda(L1L2)
(if(null?L1)L2(cons(carL1)(concatenar(cdrL1)L2)))))
;Concatenarunelementoaunalista.
;Ej:(concatenarElem'(123)4)=>(1234)
;(concatenarElem'(123)'(4))=>(123(4))
(defineconcatenarElem(lambda(LX)
(if(null?L)(listX)(invertir(consX(invertirL))))))
;Versionampliadadeconcatenarenlaqueloselementosnodebensernecesariamentelistas.
;Ej:(concatenar2'(23)9)=>(239)
;(concatenar2'(123)'(4))=>(1234)
(defineconcatenar2(lambda(E1E2)
(if(and(list?E1)(list?E2))(concatenarE1E2)
(if(and(not(list?E1))(not(list?E2)))(concatenar(listE1)(listE2))
(if(list?E1)(concatenarE1(listE2))
(concatenar(listE1)E2))))))
;Devuelvetodaslassublistasposiblesdeunalistadada.
;Ej:(sublistas'(1(23)45))=>((1)(1(23))(1(23)4)(1(23)45)((23))((23)4)((23)45)(4)(45)
(5))
;(sublistas'(123))=>((1)(12)(123)(2)(23)(3))
(definesublistas(lambda(L)
(if(null?L)'()
(concatenar(sublistasAuxL1)(sublistas(cdrL))))))
(definesublistasAux(lambda(LN)
(if(>N(longL))'()
(cons(nPrimerosNL)(sublistasAuxL(+N1))))))
;Devuelveunalistaconloselementosatomicos.
;Ej:(listaAtomos'(34(68)(2(1011)19)12(3)))=>(34682101119123)
(definelistaAtomos(lambda(L)
(if(null?L)'()
(if(nodo?(carL))(cons(carL)(listaAtomos(cdrL)))
(concatenar(listaAtomos(carL))(listaAtomos(cdrL)))))))
;DevuelvelosNprimeroselementosdeL
;Ej:(nPrimeros4'(651247))=>(6512)
(definenPrimeros(lambda(NL)
(if(=N0)'()
(cons(carL)(nPrimeros(N1)(cdrL))))))
;Devuelvetodoslosresultadosposiblesdeprefijos.
;Ej:(nPrimerosT'(12345))=>((1)(12)(123)(1234)(12345))
(definenPrimerosT(lambda(L)
(if(null?L)'()
(nPrimerosTauxL1))))
(definenPrimerosTAux(lambda(LN)
(if(=N(longL))(listL)
(cons(nPrimerosNL)(nPrimerosTAuxL(+N1))))))
;DevuelvelosNultimoselementosdeL
;Ej:(nUltimos'(71822314256)3)=>(14256)
(definenUltimos(lambda(LN)
(if(or(null?L)(>N(longL)))#f
(cond((=N1)(cdrL))
((=N0)L)
(else(nUltimos(cdrL)(N1)))))))
;Devuelveapartirden(sintomarelelementodelaposicinn)
;Ej:(aPartirN3'(765432))=>(432)
(defineaPartirN(lambda(NL)
(if(=N0)L
(aPartirN(N1)(cdrL)))))
;MenoresqueN
;Ej:(xMenores'(1834527)4)=>(123)
(definexMenores(lambda(LN)(xMenoresAux(ordenar<=L)N)))
(definexMenoresAux(lambda(LN)
(if(null?L)'()
(if(<(ultimoElemL)N)L
(xMenoresAux(quL)N)))))
;MayoresqueN
;Ej:(xMayores'(1834527)4)=>(567)
(definexMayores(lambda(LN)(xMayoresAux(ordenar<=L)N)))
(definexMayoresAux(lambda(LN)
(if(null?L)'()
(if(>(carL)N)L
(xMayoresAux(cdrL)N)))))
;DevuelveunalistaconlosanterioreselementosaX
;Ej:(ant5'(123456789))=>(1234)
(defineant(lambda(XL)
(if(null?L)'()
(if(equal?(carL)X)'()
(cons(carL)(antX(cdrL)))))))
;DevuelveunalistaconlossiguienteselementosaX
;Ej:(sig5'(123456789))=>(6789)
(definesig(lambda(XL)
(if(null?L)'()
(if(equal?(carL)X)(cdrL)
(sigX(cdrL))))))
;Devuelveunalistaconteniendodoslistas,unaconloselementosanterioresaXyotraconlos
siguientesaX.
;Ej:(izq_der5'(123456789))=>((1234)(6789))
(defineizq_der(lambda(XL)
(if(null?L)'()
(cons(antXL)(list(sigXL))))))
;DevuelvelalistaLinvertida.
;Ej:(invertir'(123456))=>(654321)
;sinprimitivas
(defineinvertir(lambda(L)
(if(null?L)'()(cons(enesimoElem(longL)L)(invertir(quL))))))
;conprimitivas
(defineinvertir(lambda(L)
(if(null?L)'()(append(invertir(cdrL))(list(carL))))))
;Invierteunalistaentodossusniveles.
;Ej:(invertirM'(12(34(56)7)89(1011(1213))))=>(((1312)1110)98(7(65)43)21)
;sinprimitivas
(defineinvertirM(lambda(L)
(if(null?L)'()
(if(list?(enesimoElem(longL)L))
(cons(invertirM(enesimoElem(longL)L))(invertirM(quL)))
(cons(enesimoElem(longL)L)(invertirM(quL)))))))
;conprimitivas
(defineinvertirM(lambda(L)
(if(null?L)'()
(if(list?(carL))(append(invertirM(cdrL))(list(invertirM(carL))))
(append(invertirM(cdrL))(list(carL)))))))
;(invertirM'(123(456)9))=>(9(654)321)
;(invertirM'(a(b(c(d(e))))))=>(((((e)d)c)b)a)
;Devuelveunalistaconteniendodossublistas,unaconelementosmenoresqueNyotraconlos
mayoresaN
;Ej:(xMayMen'(1834527)4)=>((123)(567))
(definexMayMen(lambda(LN)(list(xMenoresLN)(xMayoresLN))))
;ArmaunalistacontodaslasposicionesdeXenL
;Ej:(ocurrencias'(13246573)3)=>(27)
(defineocurrencias(lambda(LX)(ocurrenciasAuxLX1)))
(defineocurrenciasAux(lambda(LXA)
(if(null?L)'()
(if(=(carL)X)(consA(ocurrenciasAux(cdrL)X(+A1)))
(ocurrenciasAux(cdrL)X(+A1))))))
;MoveratrasNelementosdeL
;Ej:(moverAtras'(123456)3)=>(456123)
(definemoverAtras(lambda(LN)
(if(or(equal?N0)(null?L))L
(moverAtras(concatenar(cdrL)(list(carL)))(N1)))))
;MoveradelanteNelementosdeL
;Ej:(moverAdelante'(123456)3)=>(456123)
(definemoverAdelante(lambda(LN)
(if(or(equal?N0)(null?L))L
(moverAdelante(concatenar(list(ultimoElemL))(quL))(N1)))))
;MATEMATICASCONLISTAS
;Sumaloselementosdeunalista.
;Ej:(sumaElem'(1234567))=>28
(definesumaElem(lambda(L)
(if(null?L)0(+(carL)(sumaElem(cdrL))))))
;Sumaloselementosdeunalista.Multinivel.
;Ej:(sumaElemM'(12(34)5(67)0))=>28
(definesumaElemM(lambda(L)
(if(null?L)0(sumaElem(listaAtomosL)))))
;Sumaloselementosrespectivosdedoslistas,generandootraconlosresultados.Ambaslistasde
igualtamano.
;Ej:(sumaListas'(174)'(936))=>(101010)
(definesumaListas(lambda(L1L2)
(if(null?L1)'()
(cons(+(carL1)(carL2))(sumaListas(cdrL1)(cdrL2))))))
;Restaloselementosrespectivosdedoslistas,generandootraconlosresultados.Ambaslistasde
igualtamano.
;Ej:(restaListas'(174)'(936))=>(842)
(definerestaListas(lambda(L1L2)
(if(null?L1)'()
(cons((carL1)(carL2))(restaListas(cdrL1)(cdrL2))))))
;Multiplicaciondeunalistaporunescalar
;Ej:(multiplicaEscalar2'(1234))=>(2468)
(definemultiplicaEscalar(lambda(NL)
(if(null?L)'()
(cons(*N(carL))(multiplicaEscalarN(cdrL))))))
;Productocartesianodedoslistas(ambasdeiguallongitud)
;Ej:(productoCA'(123)'(234))=>20
(defineproductoCA(lambda(L1L2)
(if(null?L1)0
(+(*(carL1)(carL2))(productoCA(cdrL1)(cdrL2))))))
;DeterminacuantasvecesserepiteXenunalista.
;Ej:(ocurre4'(1324894))=>2
(defineocurre(lambda(XL)
(if(null?L)0
(if(equal?(carL)X)(+1(ocurreX(cdrL)))
(ocurreX(cdrL))))))
;DeterminacuantasvecesserepiteXenunalista.(Multinivel)
;Ej:(ocurreM3'(12(463)(24)8(1(540))3))=>2
(defineocurreM(lambda(XL)
(if(null?L)0
(if(list?(carL))(+(ocurreMX(carL))(ocurreMX(cdrL)))
(if(equal?(carL)X)(+1(ocurreMX(cdrL)))
(ocurreMX(cdrL)))))))
;Calculalacantidaddeelementosigualesenlamismaposicionendoslistas.
;Ej:(elemIguales'(12345)'(72865))=>2(porel2y5)
(defineelemIguales(lambda(L1L2)
(if(or(null?L1)(null?L2))0
(if(equal?(carL1)(carL2))(+1(elemIguales(cdrL1)(cdrL2)))
(elemIguales(cdrL1)(cdrL2))))))
;METODOSDEORDENAMIENTO
;Ordenaacendentemente
;Ej:(ordenar<='(84219207))=>(01224789)
(defineordenar<=(lambda(L)
(if(null?L)'()
(if(<=(carL)(minlL))(concatenar(list(carL))(ordenar<=(cdrL)))
(ordenar<=(concatenar(cdrL)(list(carL))))))))
;Ordenadescendentemente
;Ej:(ordenar<='(84219207))=>(98742210)
(defineordenar>=(lambda(L)(invertir(ordenar<=L))))
;ARBOLESBINARIOS
;Ejemplos:
;(raiz'(a(b()())(c()())))=>a
;(izq'(a(b()())(c()())))=>(b()())
;(der'(a(b()())(c()())))=>(c()())
(defineraiz(lambda(A)(carA)))
(defineizq(lambda(A)(cadrA)))
(defineder(lambda(A)(caddrA)))
(definehoja?(lambda(A)(if(and(null?(izqA))(null?(derA)))#t#f)))
;losnodosdeunarbolpuedensernumerososimbolos
;Ej:(nodo?'A)=>#t
(definenodo?(lambda(C)(or(number?C)(symbol?C))))
;arbol?
;Ej:(arbol?'(a(b()())(c()())))=>#t
(definearbol?(lambda(A)
(cond((null?A)#t)
((nodo?A)#f)
((!=(longA)3)#f)
(else(and(nodo?(carA))
(arbol?(cadrA))
(arbol?(caddrA)))))))
;Ej:(arbolito?'(a(b()())(c()())))=>#t
(definearbolito?(lambda(L)
(if(equal?L'())#t
(if(and(not(nodo?L))(=(longL)3)(nodo?(carL)))
(and(arbolito?(cadrL))(arbolito?(caddrL)))
#f))))
;Ej:(arbusto?'(a(b()())(c()())))=>#t
(definearbusto?(lambda(A)
(if(null?A)#t
(if(=(longA)3)
(and(arbusto?(cadrA))(arbusto?(caddrA)))
#f))))
;PesodeunArbol:sumatoria(cadahojasporsunivel)
;Ej:(peso'(0(6()())(7(3()())()))0)=>12(6*1+3*2)
(definepeso(lambda(AN)
(if(null?A)0
(if(hoja?A)(*N(raizA))
(+(peso(izqA)(+1N))(peso(derA)(+1N)))))))
;Inorden
;Ej:(inorden'(a(b()())(c()())))=>(bac)
;(inorden'(a(b(d()())(e()()))(c(f()())(g()()))))=>(dbeafcg)
(defineinorden(lambda(A)
(if(not(arbol?A))#f
(if(null?A)'()
(if(and(nodo?A)(null?(cadrA))(null?(caddrA)))
(carA)
(concatenar(concatenar(inorden(cadrA))
(list(carA)))(inorden(caddrA))))))))
;Version2
(defineinorden2(lambda(A)(if(null?A)'()
(append(inorden2(izqA))
(list(raizA))
(inorden2(derA))))))
;Postorden
;Ej:(postorden'(a(b()())(c()())))=>(bca)
;(postorden'(a(b(d()())(e()()))(c(f()())(g()()))))=>(debfgca)
(definepostorden(lambda(A)
(if(not(arbol?A))#f
(if(null?A)'()
(if(and(nodo?A)(null?(cadrA))(null?(caddrA)))
(carA)
(concatenar(concatenar(postorden(cadrA))
(postorden(caddrA)))(list(carA))))))))
;Version2
(definepostorden2(lambda(A)(if(null?A)'()
(append(postorden2(izqA))(postorden2(derA))(list(raizA))))))
;Preorden
;Ej:(preorden'(a(b()())(c()())))=>(abc)
;(preorden'(a(b(d()())(e()()))(c(f()())(g()()))))=>(abdecfg)
(definepreorden(lambda(A)
(if(not(arbol?A))#f
(if(null?A)'()
(if(and(nodo?A)(null?(cadrA))(null?(caddrA)))
(carA)
(concatenar(concatenar(list(carA))(preorden(cadrA)))
(preorden(caddrA))))))))
;Version2
(definepreorden2(lambda(A)(if(null?A)'()
(append(list(raizA))
(preorden2(izqA))
(preorden2(derA))))))
;RecorridoHorizontal(ARBOLBINARIO)
;Ej:(RH'(a(b(d()())(e()()))(c(f()())(g()()))))=>(abcdefg)
(defineRH(lambda(A)(RHaux(listA))))
(defineRHaux(lambda(A)
(if(null?A)'()
(if(null?(carA))(RHaux(cdrA))
(cons(raiz(carA))
(RHaux(append(cdrA)(list(izq(carA))(der(carA))))))))))
;PerteneceelelementoNalarbolA?
;Ej:(aPertenece'd'(a(b()(f()()))(c(e()())(d()()))))=>#t
(defineaPertenece(lambda(NA)
(if(not(arbol?A))#f
(if(null?A)#f
(if(equal?N(carA))#t
(or(aPerteneceN(cadrA))(aPerteneceN(caddrA))))))))
;Arbolcompletodenivelnyfuncionesauxiliares
;Ejemplodearbolcompleto:'(a(b(d()())(e()()))(c(f()())(g()())))
;Arboldenivel0?
;Ej:(adn0?'())=>#t
(defineadn0?(lambda(A)(cond((null?A)#t)
((and(null?(izqA))
(null?(derA)))#t)
(else#f))))
;Devuelveelnumerodeniveldeunarbol
;Ej:(nivel'(a(b(d()())(e()()))(c(f()())(g()()))))=>2
(definenivel(lambda(A)
(if(adn0?A)0(+1(max(nivel(izqA))(nivel(derA)))))))
;#tsiunArboldenivelNescompleto.
;Ej:(completo?'(a(b(d()())(e()()))(c(f()())(g()()))))=>#t
;(completo?'(a(b(d()())(e()()))(c(f()())())))=>#f
(definecompleto?(lambda(A)(completoAuxA(nivelA))))
(definecompletoAux(lambda(AN)
(cond((null?A)#f)
((=N0)#t)
((=N1)(and(notnull?(izqA))(notnull?(derA))))
(else(and(completoAux(izqA)(N1))(completoAux(derA)(N1)))))))
;GRAFOS
;Representacin((ab)(ba)(ac))c<a<>b
;adyacentenodirigido
;nousalarepresentacindearriba,sino((ab)(ac))c<>a<>b
(defineadyacente(lambda(N1N2G)
(if(or(pertenece(listN1N2)G)(pertenece(listN2N1)G))#t#f)))
;adyacentedirigido
(defineadyacenteD(lambda(N1N2G)
(if(pertenece(listN1N2)G)#t#f)))
;Devuelveunalistadenodos
;(nodos'((ab)(bd)(da)(ac)(cb)))=>(dacb)
(definenodos(lambda(G)
(eliminaR(listaAtomosG))))
;ExisteuncaminoentrelosnodosE1yE2enelgrafoG?
;Ej:(camino'a'd'((ab)(bc)(cd)(ee)(bd)(ea)(de)))=>#t
(definecamino(lambda(E1E2G)
(caminoAuxE1E2(nodosG)G)))
(definecaminoAux(lambda(E1E2NG)
(if(or(null?N)(sumidero?E1G))#f
(if(adyacenteDE1E2G)#t
(if(adyacenteDE1(carN)G)
(caminoAux(carN)E2(eliminaXE1N)G)
(caminoAuxE1E2(moverAtrasN1)G))))))
;ExisteunsumideroenelgrafoG?
;Ej:(sumidero?'e'((ab)(bc)(cd)(ee)(bd)(ea)(de)))=>#f
;(sumidero?'e'((ab)(bc)(cd)(bd)(de)))=>#t
(definesumidero?(lambda(NG)
(if(null?G)#f
(sumidero?AuxNG))))
(definesumidero?Aux(lambda(NG)
(if(null?G)#t
(if(equal?(caarG)N)#f
(sumidero?AuxN(cdrG))))))
;EsconexoelgrafoG?
;Usamosunalgoritmodistintoalqueusamosenprolog,enlugardeversiparacadanodo
;hayuncaminoatodoslosdems,vemossienunalistadetodoslosnodossepuedellegar
;del1al2,del2al3...
;(conexo?'((ab)(bc)(ca)(ae)))=>#t
;(conexo?'((ab)(bc)(ca)(ae)(tr)))=>#f
(defineconexo?(lambda(G)
(conexoAux(nodosG)G)))
(defineconexoAux(lambda(LNG)
(if(null?(cdrLN))#t
(if(camino(carLN)(cadrLN)G)(conexoAux(cdrLN)G)
#f))))
;COMBINATORIA
;PERMUTACIONCONREPETICIONESTOMADASDEAN
;Ej:(perConRep'(123)2)=>((11)(12)(13)(21)(22)(23)(31)(32)(33))
(defineperConRep(lambda(Llong)
(if(=1long)(mapSlistL)
(distribuirPCRL(perConRepL(long1))))))
(definedistribuirPCR(lambda(L1L2)
(if(null?L1)'()
(concatenar(mapS(lambda(X)(cons(carL1)X))L2)
(distribuirPCR(cdrL1)L2)))))
;PERMUTACIONESSINREPETICIONESTOMADASDEAN
;Ej:(perSinRep'(331)2)=>((33)(31)(33)(31)(13)(13))
;(perSinRep'(123)2)=>((12)(13)(21)(23)(31)(32))
(defineperSinRep(lambda(LN)
(permutaAuxLLN)))
(definepermutaAux(lambda(LMN)
(if(or(<N1)(>N(longL)))()
(if(=N1)(listaElemL)
(if(>N2)
(permutaAux(map1LM)M(N1))(map1LM))))))
(definemap1
(lambda(LM)
(if(null?L)L
(append(distribuye(carL)(borraelemSLdeL(carL)M))(map1(cdrL)M)))))
;BorraloselementosdeSLenlalistaL.
(defineborraelemSLdeL
(lambda(SLL)
(if(null?SL)L
(if(list?SL)
(borraelemSLdeL(cdrSL)(elimina1raL(carSL)))
(elimina1raLSL)))))
;generaunalistadeltipo((XL1)(XL2)...(XLn))
(definedistribuye(lambda(XL)
(if(null?L)()
(if(list?X)
(append(list(appendX(list(carL))))(distribuyeX(cdrL)))
(append(list(listX(carL)))(distribuyeX(cdrL)))))))
(definelistaElem(lambda(L)
(if(null?L)()(append(list(list(carL)))(listaElem(cdrL))))))
;COMBINACIONESCONREPETICIONES
;Ej:(comConRep'(123)2)=>((11)(21)(22)(31)(32)(33))
(definecomConRep(lambda(Llong)
(elimComRep(perConRepLlong))))
;COMBINACIONESSINREPETICIONES
;Ej:(comSinRep'(123)2)=>((21)(31)(32))
(definecomSinRep(lambda(Llong)
(elimComRep(perSinRepLlong))))
;EliminarCombinacionesRepetidas
(defineelimComRep(lambda(L)
(if(null?L)'()
(if(perteneceCom(carL)(cdrL))(elimComRep(cdrL))
(cons(carL)(elimComRep(cdrL)))))))
(defineperteneceCom(lambda(XL)
(if(null?L)#f
(if(mismaComX(carL))#t
(perteneceComX(cdrL))))))
(definemismaCom(lambda(C1C2)
(if(null?C1)#t
(if(not(pertenece(carC1)C2))#f
(mismaCom(cdrC1)(elimina1raC2(carC1)))))))
(defineelimina1ra
(lambda(Le)
(if(null?L)'()
(if(equal?e(carL))(cdrL)
(cons(carL)(elimina1ra(cdrL)e))))))
;FUNCIONESDEORDENSUPERIOR
;((op+)23)=>5(laoperacionesbinaria>+)
(defineop(lambda(O)(lambda(XY)(OXY))))
;((op+)23)=>5(laoperacionesbinaria>+)
(defineop2(lambda(O)O))
(definedos(lambda(F)(lambda(X)
(F(FX)))))
;((dos++)1)=>3(laoperacionesunaria>++)
;Repetir(F(F(F(F..F(X)))))
(definerepetir(lambda(FN)(lambda(X)
(if(=N1)(FX)(F((repetirF(N1))X))))))
;Realizaunaaccion'F'sobretodosloselementosdeunalista(Ej++,...)
;Similaraldo:deSmallTalk
;((map++)'(1234))=>(2345)
(definemap(lambda(F)(lambda(L)
(if(null?L)'()
(cons(F(carL))((mapF)(cdrL)))))))
;Igualquemapperoconunsololambda
(definemapS(lambda(FL)
(if(null?L)'()
(cons(F(carL))(mapSF(cdrL))))))
;Ejemplodeusodemap.AcadaelementodelalistaselesumaN
;(usoMap12'(111))=>(444)
(defineusoMap(lambda(N1N2L)
((map(lambda(X)(+N1N2X)))L)))
(defineusoMap2(lambda(N1N2L)
(mapS(lambda(X)(+N1N2X))L)))
(definefilterT(lambda(FL)
(if(null?L)'()
(if(F(carL))(cons(carL)(filterTF(cdrL)))
(filterTF(cdrL))))))
(definefilterF(lambda(FL)(filterT(lambda(X)(not(FX)))L)))
;EJERCICIOSRESUELTOS
;SeriedeFibonacci:11235813...
;DevuelveelelementoenesimodelaseriedeFibonacci.
;
;Ej:(Fibonacci2)=>1(Fibonacci6)=>8
(defineFibonacci(lambda(N)
(cond((=N1)1)
((=N2)1)
(else(+(Fibonacci(N1))(Fibonacci(N2)))))))
;Fibonacciiterativo
;Ej:(Fibonacci2)=>1(Fibonacci6)=>8
(definefib
(lambda(n)
(fibiter10n)))
(definefibiter
(lambda(abcount)
(if(=count0)
b
(fibiter(+ab)a(count1)))))
;Tartaglia
;DevuelvelafiladeltriangulodeTartagliacorrespondienteaN
;
;Ej:(Tartaglia7)=>(1615201561)
(defineTartaglia(lambda(N)
(cond((=N1)'(1))
((=N2)'(11))
(else(append(append'(1)(sumaDeADos(Tartaglia(N1))))'(1))))))
(definesumaDeADos(lambda(L);L=(12345)=>(3579)
(if(>(longL)1)(cons(+(carL)(cadrL))(sumaDeADos(cdrL)))'())))
;AceptadordeEstadosFinitos(maquinadeestadosfinitos).
;(AEF'(121)'(ABA((AB1)(AC2)(BA2)(CB3))))=>t
(defineAEF(lambda(SM)
(if(null?S)
(if(equal?(FM)(AM))#t#f)
(AEF(cdrS)(trans(carS)MM)))))
(definetrans(lambda(TrM1M2)
(if(and(equal?(N1M1)(AM1))(equal?(TM1)Tr))
(list(IM1)(FM1)(N2M1)(GM2))
(transTr(list(IM1)(FM1)(AM1)(cdr(GM1)))M2))))
(defineIcar)(defineFcadr)(defineAcaddr)(defineGcadddr)
(defineN1(lambda(M)
(caar(GM))))
(defineN2(lambda(M)
(cadar(GM))))
(defineT(lambda(M)
(caddar(GM))))
;EJERCICIO34
;Representamseficientementeunamatrizrala.Devuelveunalistaconteniendoternas(XYV)
V<>0
;Ej:(convierte'((1000200)(01500)(20000)))=>((1110)(1420)(221)(235)(312))
(defineconvierte2(lambda(M)
(if(null?M)'()
(convierte2Aux1M))))
(defineconvierte2Aux(lambda(FM)
(if(null?M)'()
(concatenar(filaF1(carM))(convierte2Aux(++F)(cdrM))))))
(definefila(lambda(FCL)
(if(null?L)'()
(if(equal?(carL)0)(filaF(++C)(cdrL))
(cons(listFC(carL))(filaF(++C)(cdrL)))))))
;EJERCICIO37
;Dadounarbolnarioconnodos1o0,determinasiunapalabrapuedeleerserecorriendoalguna
rama
;Ej:(check'(1000)'(1(1(1(1))(1))(0(0))(1(0))))=>#f
;(check'(100)'(1(1(1(1))(1))(0(0))(1(0))))=>#t
(definecheck(lambda(PA)
(if(null?P)#t
(if(and(equal?(carA)(carP))(enHijo(cdrA)(cdrP)))#t#f))))
(defineenHijo(lambda(HP)
(if(and(null?H)(null?P))#t
(if(and(null?H)(not(null?P)))#f
(not(null?(filterT(lambda(X)(checkPX))H)))))))
;EJERCICIO38
;Dadaunalistadefunciones(deunargumento)yunadeelementos,aplicacadaunadelas
funciones
;aloselementosdelalista.
;(mapFun'(++par?)'(1235))=>((2346)(0124)(#f#t#f#f))
(definemapFun(lambda(FL)
(if(null?F)'()
(append(list(mapS(eval(carF))L))
(mapFun(cdrF)L)))))
;Ejercicio36:Funcionimpar
;FesunafuncionyLunalistadevaloresparaelargumentoxdeF
;(fi'(+1X)'(123))=>#f
;(fi'(*XX)'(123))=>#t
;(fi'(*(+X2)(+X2))'(123))=>#f
;(fi'(*(+X2)(X2))'(123))=>#t
(definefi(lambda(FL)
(if(equal?(fiAuxF1L)(fiAuxF1L))#t#f)))
(definefiAux(lambda(FVL)
(if(null?L)L
(cons(evaluar(xReemplazarM'X(*V(carL))F))(fiAuxFV(cdrL))))))
(defineevaluar(lambda(F)
(cond[(and(list?(cadrF))(list?(caddrF)))
((eval(carF))(evaluar(cadrF))(evaluar(caddrF)))]
[(list?(cadrF))((eval(carF))(evaluar(cadrF))(caddrF))]
[(list?(caddrF))((eval(carF))(cadrF)(evaluar(caddrF)))]
[else((eval(carF))(cadrF)(caddrF))])))
;EJERCICIO39b
;Dadaunalistaderboles,devuelveeldemenorpeso.
;Ej:(mapeoArboles'((0(6()())(7()()))(0(0(2()())(3()()))(5()()))))=>(0(6()())(7()()))
(definemapeoArboles(lambda(LA)
(if(null?LA)'0
(enesimoElem(car(ocurrencias(armalistaSumasLA)
(minL(armalistaSumasLA))))LA))))
(definearmalistaSumas(lambda(LA)
(if(null?LA)'()
(cons(peso(carLA)0)(armalistaSumas(cdrLA))))))
;EJERCICIO40
;Cambiadeunaformaderepresentacindegrafosaotra.
;Ej:(convierte'((abcde)((ab)(bc)(bd)(ce)(da)(de)(ea))))
;((a(b))(b(cd))(c(e))(d(ae))(e(a)))
(defineconvierte(lambda(L)
(if(null?L)'()
(convierteAux(carL)(cadrL)))))
(defineconvierteAux(lambda(LG)
(if(null?L)'()
(cons(list(carL)(extrae(carL)G))(convierteAux(cdrL)G)))))
(defineextrae(lambda(NG)
(if(null?G)'()
(if(equal?N(caarG))(cons(cadarG)(extraeN(cdrG)))
(extraeN(cdrG))))))
;EJERCICIO41
;Sequierecalcularlascomicionesdeunviajante.
;Ej:(comisiones'((Pepe(100A)(50B))(Ana(50A)(100B)(20C)))'((A0.5)(B0.2)(C0.1)))
;((pepe(100a)(50b)60.0)(ana(50a)(100b)(20c)47.0))
(definecomisiones(lambda(ViajantesP)
(if(null?Viajantes)'()
(append(list(append(carViajantes)
(list(sumaElem(comicionV(cdarViajantes)P)))))
(comisiones(cdrViajantes)P)))))
(definecomicionV(lambda(LVP)
(mapS(lambda(X)(comicionPPX))LV)))
(definecomicionP(lambda(PV)
(if(equal?(caarP)(cadrV))
(*(cadarP)(carV))
(comicionP(cdrP)V))))
;EJERCICIODEEXAMEN:05/08/2002
;CrearunafuncindeordensuperiorparacalcularelsenodeA(enradianes)
;conunaseriedeNelementos
;NOestaresultandoigualalafuncionseno,nodebesercorrectalaformulaquenosdieron.
(defineSerie(lambda(N)(lambda(A)
(if(=N1)0
(+(/(*(potencia1N)(potenciaA(+N1)))
(fact(+N1)))
((Serie(N1))A))))))
(defineSerieS(lambda(NA)
(if(=N1)0
(+(/(*(potencia1N)(potenciaA(+N1)))
(fact(+N1)))
(SerieS(N1)A)))))
;EJERCICIODEEXAMEN:Sumadordenmerosbinarios
;Ej:(SumaBin'(100)'(1))=>(101)
;(SumaBin'(11101)'(1001))=>(100110)
(defineSumaBin(lambda(N1N2)
(cond[(null?N2)N1]
[(null?N1)N2]
[else(if(=2(+(ultimoElemN1)(ultimoElemN2)))
(concatenar2(SumaBin(SumaBin'(1)(quN2))(quN1))0)
(concatenar2(SumaBin(quN2)(quN1))
(+(ultimoElemN2)(ultimoElemN1))))])))
;EJERCICIODEEXAMEN:Composiciondefunciones(fgh)=>(f(g(h)))
;(componer'((+(ln(^x2))x)(+x1)(sinx)))=>(+(ln(^(+(sinx)1)2))(+(sinx)1))
(definecomponer(lambda(L)
(if(=(longL)1)(carL)
(componer(cons(xReemplazarM'x(cadrL)(carL))
(cddrL))))))
;Orden(CriterioLista)
;Dadaunalistadenmerosyuncriteriodeordenacin(<,>,>=,...)devuelvelassubsecuencias
;(delongitudmayora1)completasqueverificanestecriterio.
;Ej:(orden<'(123171524667789))=>((123)(171524)(66778))
(defineorden(lambda(criterioL)
(if(null?L)L
(if(null?(ordenAuxcriterioL))(ordencriterio(cdrL))
(cons(cons(carL)(ordenAuxcriterioL))
(ordencriterio(sacaNpri(+1(long(ordenAuxcriterioL)))L)))))))
(defineordenAux(lambda(criterioL)
(if(=(longL)1)'()
(if(criterio(carL)(cadrL))
(cons(cadrL)(ordenAuxcriterio(cdrL)))
'()))))
;EJERCICIOFOR(notienemuchalogica..)
;Ej:(for120001'((lambda()#t)()()))=>()
(definefor(lambda(ifcs)
(if(<=if)
(and(evaluarFors)
(for(+ic)fcs)
()))))
(defineevaluarFor(lambda(s)
(if(null?s)s
(if((eval(cars)))(evaluarFor(cadrs))
(evaluarFor(caddrs))))))
;ARBOLDEDIRECTORIO
;Ej:(buscarar1'(d0d1a1))=>"archivo"
;Ej:((eval(lambda()"archivo")))=>"archivo"
(definebuscar(lambda(DA)
(if(null?A)((eval(carD)))
(buscar(cdar(filterT(lambda(X)(equal?(carA)(carX)))D))(cdrA)))))
(definear1'((d0(d1(a1(lambda()"archivo"))))))