31
Los Retos PHPeros / Re:[RETO] calcular factorial
« en: 25 de Agosto de 2011, 22:28:22 pm »
porcierto, no hay que limitarse a lo que haya dentro de la función, podeis usar estructuras
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
La más eficiente sin tu último requerimiento sería esta:
function factorial ($numero){return $numero == 1 ? $numero : $numero * factorial($numero - 1);
}
La forma más eficiente –según creo– es usando recursividad. En breve lo subo.
Hola Good,
Verás, no se si llegas a entenderme bien. A lo que yo voy es a decirte que por muy "eficaz" y rápida crees una función dará igual si la llamas 5000 veces. La función no sabe cuantas veces la está llamando por lo tanto no se puede hacer nada respecto a ello.
Si, visto de esa forma si que es mas corto de elaborar. Bien visto así Physlet, enhorabuena.
Un saludo,
Siquillote.
Hola Good,
Verás, la cosa del reto (según a mi entender) es crear una función que elabore ese algoritmo no hacer que si a partir de X numero vaya mas rápido o lento o si llamas a la funcion 80 veces en tu script, ¿No crees?.
Un saludo,
Ángel.
Hola Good,
La verdad no entiendo porque dices que no es lo suficientemente rápido... a mi ni me tarda milésimas. En cuanto a que dices que se puede optimizar yo creo que es "imposible". Se utilizan los métodos exactos y concisos, ni mas ni menos. Hombre, se podría simplificar quitando la función pero como tu pedías una función...
Un saludo,
Siquillote.

No es por nada pero... No te estás explicando nada en los enunciados de estos retos.
Apenas estoy comenzando el estudio de los grafos, pero de igual forma este enunciado no explica nada.
Saludos.
#include <iostream>
#include <vector>
using namespace std;
typedef vector<vector<int> > VVI;
typedef vector<pair<int, int> > VPII;
bool se_puede (VVI& v, int xx, int y, int numero) {
for (int i = 0; i < 9; ++i) {
if (v[xx][i] == numero) return false;
else if (v[i][y] == numero) return false;
}
int fil = 3*(xx/3);
int col = 3*(y/3);
for (int i = fil; i < fil+3; ++i) {
for (int x = col; x < col+3; ++x) {
if (v[i][x] == numero) return false;
}
}
return true;
}
void backtrack (VVI& sudoku, VPII& pos, int count) {
if (count == pos.size()) {
for (int i = 0; i < 9; ++i) {
for (int x = 0; x < 8; ++x) cout << sudoku[i][x] << " ";
cout << sudoku[i][8];
cout << endl;
}
} else {
pair<int, int> p = pos[count];
int posX = p.first;
int posY = p.second;
for (int i = 0; i < 9; ++i) {
if (se_puede(sudoku, posX, posY, i+1)) {
sudoku[posX][posY] = i+1;
backtrack(sudoku, pos, count+1);
sudoku[posX][posY] = 0;
}
}
}
}
int main () {
VVI sudoku(9, vector<int>(9));
VPII blank;
for (int i = 0; i < 9; ++i) {
for (int x = 0; x < 9; ++x) {
cin>>sudoku[i][x];
if (sudoku[i][x] == 0) blank.push_back(make_pair(i, x));
}
}
backtrack(sudoku, blank, 0);
}#include <iostream>
#include <vector>
using namespace std;
typedef vector<int> VI;
void imprime_vector (VI& v) {
for (int i = 0; i < int(v.size()); ++i) cout << v[i];
cout << endl;
}
void combinaciones (int count, VI& v) {
if (int(v.size()) == count) {
imprime_vector(v);
return;
}
v[count] = 0;
combinaciones(count+1, v);
v[count] = 1;
combinaciones(count+1, v);
}
int main () {
int n;
cin>>n;
VI v(n);
combinaciones(0, v);
}