\documentclass[]{article} \usepackage[utf8]{inputenc} \usepackage[spanish]{babel} \usepackage{listings} \usepackage{xcolor} \usepackage[a4paper, total={6.5in, 8in}]{geometry} \definecolor{codegreen}{rgb}{0,0.6,0} \definecolor{codegray}{rgb}{0.5,0.5,0.5} \definecolor{codepurple}{rgb}{0.58,0,0.82} \definecolor{backcolour}{rgb}{0.95,0.95,0.92} \lstdefinestyle{mystyle}{ backgroundcolor=\color{backcolour}, commentstyle=\color{codegreen}, keywordstyle=\color{magenta}, numberstyle=\tiny\color{codegray}, stringstyle=\color{codepurple}, basicstyle=\ttfamily\footnotesize, breakatwhitespace=false, breaklines=true, captionpos=b, keepspaces=true, numbers=left, numbersep=5pt, showspaces=false, showstringspaces=false, showtabs=false, tabsize=2 } \lstset{style=mystyle} \newcommand{\quotes}[1]{``#1''} %opening \title{Soluciones a los principales problemas con arreglos} \author{betology} \date{} \begin{document} \section{Código en Go para la funcion findPeak} \begin{lstlisting}[language=Go] package main import "fmt" // FindPeak finds the peak element in the array func findPeak(arr []int) int { n := len(arr) // first or last element is peak element if n == 1 { return 0 } if arr[0] >= arr[1] { return 0 } if arr[n-1] >= arr[n-2] { return n - 1 } // check for every other element for i := 1; i < n-1; i++ { // check if the neighbors are smaller if arr[i] >= arr[i-1] && arr[i] >= arr[i+1] { return i } } return -1 // indicating no peak found } func main() { arr := []int{1, 3, 20, 4, 1, 0} fmt.Println("Index of a peak point is", findPeak(arr)) } \end{lstlisting} \section{Explicación del código en Go} Explicación de cada línea: \begin{lstlisting}[language=Go, numbers=left, stepnumber=0] package main import "fmt" \end{lstlisting} \textbf Definimos el paquete principal `main` y luego importamos el paquete `fmt`, que necesitaremos para imprimir los resultados en la consola. \begin{lstlisting}[language=Go, stepnumber=0] func findPeak(arr []int) int { n := len(arr) \end{lstlisting} \textbf Definimos una función llamada `findPeak` que toma una matriz de enteros como entrada y devuelve un entero (el índice con el número más alto). Calculamos la longitud de la matriz de entrada `arr` y la almacenamos en la variable `n`. \begin{lstlisting}[language=Go] if n == 1 { return 0 } \end{lstlisting} \textbf Si la longitud de la matriz es 1, significa que hay solo un elemento en la matriz, y ese elemento es el pico. Entonces, devolvemos 0 como el índice del pico. \begin{lstlisting} if arr[0] >= arr[1] { return 0 } \end{lstlisting} \textbf Comprobamos si el primer elemento de la matriz es mayor o igual que el segundo. Si es así, entonces el primer elemento es el pico y devolvemos 0 como el índice del pico. \begin{lstlisting}[language=Go, numbers=left, stepnumber=5, firstnumber=9] if arr[n-1] >= arr[n-2] { return n - 1 } \end{lstlisting} \textbf Similar al paso anterior, aquí comprobamos si el último elemento de la matriz es mayor o igual que el segundo desde el final. Si es así, entonces el último elemento es el pico y devolvemos su índice. \begin{lstlisting}[language=Go, numbers=left, stepnumber=5, firstnumber=11] for i := 1; i < n-1; i++ { \end{lstlisting} \textbf{Líneas 11-12:} Este bucle itera sobre los elementos de la matriz, excepto el primero y el último. \begin{lstlisting}[language=Go, numbers=left, stepnumber=5, firstnumber=13] if arr[i] >= arr[i-1] && arr[i] >= arr[i+1] { return i } } return -1 } \end{lstlisting} \textbf Dentro del bucle, comprobamos si el elemento actual es mayor o igual que sus vecinos. Si es así, entonces el elemento actual es el pico y devolvemos su índice. Si no se encuentra ningún pico, devolvemos -1 para indicar que no se encontró ningún pico en la matriz. \begin{lstlisting}[language=Go, numbers=left, stepnumber=5, firstnumber=20] func main() { arr := []int{1, 3, 20, 4, 1, 0} fmt.Println("Index of a peak point is", findPeak(arr)) } \end{lstlisting} \textbf Ahora definimos la función `main`, que es la entrada principal del programa. Creamos una matriz de enteros llamada `arr` con valores dados. Llamamos a la función `findPeak` con la matriz `arr` y mostramos el índice del punto de pico en la consola. \end{document}