Skip to content

Commit 00f0757

Browse files
authored
Merge pull request kelvins#138 from MarceloLuisDantas/fatorial
Fatorial
2 parents 45c597a + 3fb2aa1 commit 00f0757

File tree

5 files changed

+214
-16
lines changed

5 files changed

+214
-16
lines changed

README.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -791,8 +791,8 @@ Com o objetivo de alcançar uma abrangência maior e encorajar novas pessoas a c
791791
</a>
792792
</td>
793793
<td> <!-- Rust -->
794-
<a href="./CONTRIBUTING.md">
795-
<img align="center" height="30" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/github/github-original.svg" />
794+
<a href="./src/rust/fatorial.rs">
795+
<img align="center" height="30" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/rust/rust-plain.svg"/>
796796
</a>
797797
</td>
798798
<td> <!-- Elixir -->
@@ -2756,8 +2756,8 @@ Com o objetivo de alcançar uma abrangência maior e encorajar novas pessoas a c
27562756
</a>
27572757
</td>
27582758
<td> <!-- Rust -->
2759-
<a href="./CONTRIBUTING.md">
2760-
<img align="center" height="30" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/github/github-original.svg" />
2759+
<a href="./src/rust/quick_sort.rs">
2760+
<img align="center" height="30" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/rust/rust-plain.svg" />
27612761
</a>
27622762
</td>
27632763
<td> <!-- Elixir -->
@@ -3129,8 +3129,8 @@ Com o objetivo de alcançar uma abrangência maior e encorajar novas pessoas a c
31293129
</a>
31303130
</td>
31313131
<td> <!-- Rust -->
3132-
<a href="./CONTRIBUTING.md">
3133-
<img align="center" height="30" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/github/github-original.svg" />
3132+
<a href="./src/rust/soma_dois_numeros.rs">
3133+
<img align="center" height="30" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/rust/rust-plain.svg" />
31343134
</a>
31353135
</td>
31363136
<td> <!-- Elixir -->

src/rust/fatorial.rs

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
Contribuidores
3+
- Dromedario de Chapéu
4+
5+
Fatorial é uma função matematica que consistem em realizar
6+
a multiplicação de todos os antecessores de um numero.
7+
8+
Ex: 5! = 5 * 4 * 3 * 2 * 1 = 120
9+
*/
10+
11+
// A diferença desta implementação para a com recursão é
12+
// que nesta versão o retorno, é feito utilizado interadores.
13+
fn fatorial(valor: u128) -> u128 {
14+
let total = match valor {
15+
0 => 1,
16+
// Product faz a multiplicação de todos os valores em um array
17+
1.. => (1..valor+1).product(),
18+
};
19+
return total
20+
}
21+
22+
fn main() {
23+
println!("{}", fatorial(21));
24+
}
25+
26+
#[cfg(test)]
27+
mod test {
28+
use super::*;
29+
#[test]
30+
fn teste_fatorial() {
31+
assert_eq!(fatorial(0), 1);
32+
assert_eq!(fatorial(1), 1);
33+
assert_eq!(fatorial(10), 3628800);
34+
}
35+
}

src/rust/fatorial_recursiva.rs

+33-10
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,36 @@
1-
fn main(){
2-
println!("{:?}", fatorial_recursiva(3));
3-
println!("{:?}", fatorial_recursiva(4));
4-
println!("{:?}", fatorial_recursiva(5));
5-
println!("{:?}", fatorial_recursiva(10));
1+
/*
2+
Contribuidores
3+
- Heitor582
4+
- Dromedario de Chapéu
5+
6+
Fatorial é uma função matematica que consistem em realizar
7+
a multiplicação de todos os antecessores de um numero.
8+
9+
Ex: 5! = 5 * 4 * 3 * 2 * 1 = 120
10+
*/
11+
12+
// Para realizar uma fatoração com recursão basta fazer o retorno
13+
// de uma função ser valor * a propia função recebendo valor - 1
14+
fn fatorial(valor: u128) -> u128 {
15+
// Para que não chege a multiplicar por 0 quando chegamos a 1 ou 0 é
16+
// retornado 1 para que o utlimo valor não sejá zerado ao multiplicar por zero
17+
match valor {
18+
0 | 1 => 1,
19+
2.. => valor * (fatorial(valor - 1)),
20+
}
21+
}
22+
23+
fn main() {
24+
println!("{}", fatorial(21));
625
}
726

8-
fn fatorial_recursiva(number: i32) -> i32 {
9-
if number <= 1 {
10-
return 1;
11-
}
12-
number * fatorial_recursiva(number - 1)
27+
#[cfg(test)]
28+
mod test {
29+
use super::*;
30+
#[test]
31+
fn teste_fatorial() {
32+
assert_eq!(fatorial(0), 1);
33+
assert_eq!(fatorial(1), 1);
34+
assert_eq!(fatorial(10), 3628800);
35+
}
1336
}

src/rust/quick_sort.rs

+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
/*
2+
3+
Contribuidores
4+
- Dromedario de chapeu
5+
6+
O Quick Sort, é um dos algoritmos de ordenação padrões de se estudar.
7+
Ele é famoso por ser relativamente eficiente na maioria dos casos, tendo
8+
complexidade O(n log n). Porem em casos específicos ele pode chegar a ser
9+
O(n²) nos piores casos, como a lista estar basicamente invertida por exemplo.
10+
O Quick Sort adota a estrategia de "dividir e conquistar", que é resumidamente
11+
dividir a lista em sub 2 listas e organizar essas sub listas. A cada execução
12+
é escolhido o Pivot, e a partir deste Pivot nos comparamos todos os elementos
13+
da lista ate encontrar algum valor menor ou igual ao pivot, quando encontrarmos
14+
este valor, ele é colocado a frente do pivot. Quando passarmos por toda a
15+
lista, nos fazemos o swap entre o pivot e o ultimo índice que foi coloca a sua
16+
frene, assim nos teremos a garantia de que todos os itens a esquerda do pivot
17+
sejam menores, e os a direita maiores. E assim nos pegamos essas 2 novas listas,
18+
e fazemos o mesmo processo.
19+
20+
Recomendo dar uma olhada mais profunda sobre o funcionado e casos específicos,
21+
como os diferentes métodos de partição e funcionado com múltiplos pivot's, prometo
22+
que é algo mais interessante e menos chato do que parece.
23+
Links: https://pt.wikipedia.org/wiki/Quicksort
24+
https://rosettacode.org/wiki/Sorting_algorithms/Quicksort
25+
26+
*/
27+
28+
29+
// l = limite esquerdo
30+
// r = limite direito
31+
// É preciso indicar esses valores invés de gerar uma nova lista a cada divisão
32+
// primeiramente para sempre lidarmos com a mesma lista, alterando os seus valores
33+
// e segundamente porque ficar criando novas listas seria muito custoso em uma recursão
34+
fn partition(lista: &mut [i32], l: usize, r: usize) -> isize {
35+
// Declaramos o nosso pivot sendo o primeiro item da lista
36+
let pivot = lista[l];
37+
38+
// Para colocarmos os valores menores ou iguais ao pivot na sua frente
39+
// precisamos de uma variável pra contar quantos índices a frente colocar
40+
// o novo valor a frente, para não ficarmos trocando o mesmo valor
41+
let mut count = l;
42+
43+
// For para fazer interação na lista. Não usamos enumerate pois precisamso
44+
// simular as sub listas
45+
for j in l + 1..r + 1 {
46+
if lista[j] <= pivot {
47+
count += 1;
48+
lista.swap(count, j);
49+
}
50+
}
51+
52+
// Trocamos o índice de pivot de lugar com o ultimo menor/igual valor, pois
53+
lista.swap(l, count);
54+
55+
// O índice onde apos a troca se encontra o Pivot é retornado, para que sirva
56+
// como referencia, para as 2 sub listas, 0..count - 1 e count + 1..len serão
57+
// as novas listas.
58+
return count as isize;
59+
}
60+
61+
fn quick_sort(lista: &mut [i32], l: isize, r: isize) {
62+
// A condição de parda da recuroa é caso tanto o extremo direito quanto esquerdo
63+
// sejam iguais, ou sejá, a lista so tem 1 elemento
64+
if l < r {
65+
let indice_pivot = partition(lista, l as usize, r as usize);
66+
quick_sort(lista, l, indice_pivot - 1);
67+
quick_sort(lista, indice_pivot + 1, r);
68+
}
69+
}
70+
71+
fn printa(lista: Vec<i32>) {
72+
for i in lista.iter() {
73+
print!("{} ", *i);
74+
}
75+
println!();
76+
}
77+
78+
fn main() {
79+
let mut lista = vec![1, 6, 3, 9, 3, 8, 5, 2, 7];
80+
let len = lista.len() as isize;
81+
82+
printa(lista.clone());
83+
quick_sort(&mut lista, 0, len - 1);
84+
printa(lista.clone());
85+
}
86+
87+
#[cfg(test)]
88+
mod test {
89+
use crate::*;
90+
91+
#[test]
92+
fn quick() {
93+
let mut lista = vec![9, 8, 7, 6, 5, 4, 3, 2, 1];
94+
let len = lista.len() as isize - 1;
95+
quick_sort(&mut lista, 0, len);
96+
assert_eq!(vec![1,2,3,4,5,6,7,8,9], lista);
97+
98+
let mut lista = vec![1, 2, 3, 4, 5, 6, 7, 8, 9];
99+
let len = lista.len() as isize - 1;
100+
quick_sort(&mut lista, 0, len);
101+
assert_eq!(vec![1, 2, 3, 4, 5, 6, 7, 8, 9], lista);
102+
}
103+
}

src/rust/soma_dois_numeros.rs

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
use std::collections::HashMap;
2+
fn existe_soma(lista: &[i32], x: i32) -> bool {
3+
let mut valores = HashMap::new();
4+
for (indice, valor) in lista.iter().enumerate() {
5+
valores.insert(valor, indice);
6+
let diff = x - valor;
7+
if valores.contains_key(&diff) {
8+
if valores[&diff] != indice {
9+
return true;
10+
}
11+
}
12+
}
13+
return false;
14+
}
15+
16+
fn main() {
17+
let lista = vec![1, 2, 3, 4, 5, 6, 7, 8];
18+
println!("{}", existe_soma(&lista, 3));
19+
}
20+
21+
#[cfg(test)]
22+
mod test {
23+
use super::*;
24+
#[test]
25+
fn t_exite_soma() {
26+
let lista = vec![1, 2, 3, 4, 5, 6, 7, 8];
27+
28+
assert_eq!(existe_soma(&lista, 3), true);
29+
assert_eq!(existe_soma(&lista, 5), true);
30+
assert_eq!(existe_soma(&lista, 7), true);
31+
assert_eq!(existe_soma(&lista, 15), true);
32+
33+
assert_eq!(existe_soma(&lista, 1), false);
34+
assert_eq!(existe_soma(&lista, 2), false);
35+
assert_eq!(existe_soma(&lista, 16), false);
36+
}
37+
}

0 commit comments

Comments
 (0)