orfeas1601 Δημοσ. 6 Μαρτίου 2010 Δημοσ. 6 Μαρτίου 2010 λοιπόν το πρόβλημα εχει ως εξής το ν!=παραγοντικό ισούται με π.χ 3!=3*2*1=6 4!=4*3*2*1=24 δείχνει το σύνολο των μεταθέσεων δηλ.. 3!=6 σημαίνει ότι έχουμε σύνολο 6 μεταθέσεις παράδειγμα 123 132 213 231 312 321 Πρέπει να γραφεί κώδικας που να διαβάζει το ν και να υπολογίζει τις μεταθέσεις με κάποιο τρόπο.Το αποτέλεσμα είναι αυτό που βλέπετε... Εάν μπορεί κάποιος να βοηθήσει.... ευχαριστώ ,σας παραθέτω τον κώδικα >#include <stdio.h> int print(int apo, int pros); int main () { system("chcp 1253>nul"); int i,n; printf ("****************υπολογισμός παραγοντικού******************\n"); do { printf ("\nΠαρακαλώ δώστε το παραγοντικό του: "); scanf ("%d", &n); if (n<0) printf ("Μη αποδεκτός αριθμός,παρακαλώ δώστε θετικό αριθμό\n"); } while (n<0); printf ("\n%d! = %d\n\n", n , anad(n)); //εκτύπωση του παραγοντικού for(i=0;i<anad(n);i++)// { printf("\n"); print(1,n);//κλήση της συνάρτησης για εκτύπωση printf("\n"); } printf("\n\n"); system("pause"); return 0; } int print(int apo, int pros)//συνάρτηση για την εκτύπωση των { //μεταθέσεων if (apo<=pros) { printf("%d ",apo); print(apo+1,pros); } } int anad (int n) //υλοποίηση του παραγοντικού n! { if (n==0) return 1;//επιστρέφει 1 else return (n*anad(n-1));//επιστρέφει το αποτέλεσμα για n! }
bxenos Δημοσ. 6 Μαρτίου 2010 Δημοσ. 6 Μαρτίου 2010 π.χ. με recursion κάνεις κάτι σαν το παρακάτω > typedef char item; item x[n]; const item Smallest='0',Largest='9'; print(item *x,int pos){ if(pos<n){ for(x[pos]=Smallest;x[pos]<Lasrgest;x[pos]++){ print(x,pos+1); } } else τυπωσε τρέχουσα κατασταση πινακα x } και φυσικά γίνεται πολύ απλά και με loop
bxenos Δημοσ. 6 Μαρτίου 2010 Δημοσ. 6 Μαρτίου 2010 Κατ'αρχην δεν είσαι ξεκάθαρος στο τι δεν κατάφερες να "κάνεις". Θελεις να εμφανίζεις τις διαφορετικές "μεταθέσεις"; αν ναι, στο σημείο του προγράμματος που θέλεις να εμφανίζονται θα το κάνεις. Είδα ότι απλά τυπώνεις το ιδιο πράγμα συνέχεια (χωρις "μεταθέσεις"). Με ποιά μέθοδο έχεις υλοποιήσει την μέθοδο υπολογισμού του παραγοντικού; Μπορείς να περιγράψεις τι κάνει ο κώδικας που έγραψες; Μπορείς να τον στοιχίσεις σωστά; (είναι σαν δέντρο που γέρνει προς τα αριστερα).
orfeas1601 Δημοσ. 6 Μαρτίου 2010 Μέλος Δημοσ. 6 Μαρτίου 2010 Έχεις δίκιο,στοίχησα τον κώδικα,έγραψα και σχόλια. Θέλω ο κώδικας να κάνει τις μεταθέσεις των αριθμών όπως είναι στο αρχικό μήνυμά μου.Απλά τον έφτασα σε αυτό το σημείο,έχοντας κολλήσει .....Σίγουρα δεν είναι έχει τελειώσει.
bxenos Δημοσ. 6 Μαρτίου 2010 Δημοσ. 6 Μαρτίου 2010 ...στοίχησα τον κώδικα... πού; μπορείς να περιγράψεις με ποιόν τρόπο λειτουργεί ο υπολογισμός του παραγοντικού που έχεις κάνει; (αν δεν έχεις καταλάβει τη μέθοδο αυτή, δεν σου χρησιμεύει και ο ψευδοκώδικας που έγραψα)
orfeas1601 Δημοσ. 6 Μαρτίου 2010 Μέλος Δημοσ. 6 Μαρτίου 2010 πού; μπορείς να περιγράψεις με ποιόν τρόπο λειτουργεί ο υπολογισμός του παραγοντικού που έχεις κάνει; (αν δεν έχεις καταλάβει τη μέθοδο αυτή, δεν σου χρησιμεύει και ο ψευδοκώδικας που έγραψα) στο αρχικό μήνυμά μου έχω τοποθετήσει και τον κώδικα και σχόλια γι'αυτόν. η συνάρτηση anand υπολογίζει το παραγοντικό πχ του 3,του 4 , κλπ...
bxenos Δημοσ. 7 Μαρτίου 2010 Δημοσ. 7 Μαρτίου 2010 στο αρχικό μήνυμά μου έχω τοποθετήσει και τον κώδικα και σχόλια γι'αυτόν. Δεν είναι στοιχισμένος ο κωδικας, τα σχόλια που έχεις βάλει είναι τα προφανή και δεν είναι απαραίτηταη συνάρτηση anand υπολογίζει το παραγοντικό πχ του 3,του 4 , κλπ... τη μεθοδολογία για τη συνάρτηση ζηταω
orfeas1601 Δημοσ. 7 Μαρτίου 2010 Μέλος Δημοσ. 7 Μαρτίου 2010 τη μεθοδολογία για τη συνάρτηση ζηταω >int anad (int n) //υλοποίηση του παραγοντικού n! { if (n==0) return 1;//επιστρέφει 1 else return (n*anad(n-1));//επιστρέφει το αποτέλεσμα για n! } για να βρούμε την τιμή του παραγοντικού π.χ του !3=3*2*1=6, για !4=4*3*2*1=24...κλπ.Εδώ επιστρέφει n*anad(n-1) η οποία υπολογίζει το παραγοντικό.Ίσως κάπου μπερδευόμαστε και δεν μπορώ να σε καταλάβω τι ακριβώς μου ζητάς.Τρέξε τον κώδικα ,αλλά δεν έχει ολοκληρωθεί,θα πρέπει να εμφανίσει με τις κατάλληλες εντολές τις μεταθέσεις των στοιχείων ,δλη 123 132 213 231 312 321 οι μεταθέσεις των στοιχείων όσες και το αποτέλεσμα για !3=6.Εάν ήταν !4=24 θα είχαμε 24 μεταθέσεις ---------- Προσθήκη στις 10:44 ---------- Προηγούμενο μήνυμα στις 09:53 ---------- σου παραθέτω κώδικα για !n=3 >#include <stdio.h> void print(const int *v, const int size) { int i; if (v != 0) { for ( i = 0; i < size; i++) { printf("%4d", v[i] ); } printf("\n"); } } // print void permute(int *v, const int start, const int n) { int i; if (start == n-1) { print(v, n); } else { for ( i = start; i < n; i++) { int tmp = v[i]; v[i] = v[start]; v[start] = tmp; permute(v, start+1, n); v[start] = v[i]; v[i] = tmp; } } } main() { int v[] = {1, 2, 3}; permute(v, 0, sizeof(v)/sizeof(int)); system("pause"); } ---------- Προσθήκη στις 10:59 ---------- Προηγούμενο μήνυμα στις 10:44 ---------- κοίτα εδώhttp://http://www.bearcave.com/random_hacks/permute.html
bxenos Δημοσ. 7 Μαρτίου 2010 Δημοσ. 7 Μαρτίου 2010 Κοιτα τη μεθοδολογία τη ξέρω, ηθελα να δω αν όμως έχεις καταλλάβει τον όρο αναδρομή ή recursion. Αυτή η μέθοδος έχει χρησιμοποιηθεί στον υπολογισμό του παραγοντικού (που δεν έχει την παραμικρή υποψία στοιχισης). Αυτη τη μέθοδο χρησιμοποίησα και εγώ στο (μη ολοκληρωμένο) παράδειγμα που σου έδωσα για την print. Πρέπει πρωτα να διαβάσεις τι κάνει η αναδρομή (και το απλούστερο ίσως παράδειγμα της, ο υπολογισμός παραγοντικού) και μετά να πας σε λίγο πιό δύσκολη περίπτωση, όπως της print που ακολουθεί: > void print(x[],int pos,int n){ //n = αριθμός του οποίου το παραγοντικο θέλουμε //pos είναι μετρητης για την αναδρομή //χ[] πίνακας που γεμίζει η αναδρομη if(pos<n){ for(x[pos]='0';x[pos]<=n+'0';x[pos]++){//για όλους τους συνδιασμούς στη θέση pos αν το x[pos] δεν έχει χρησιμοποιηθει στις θέσεις x[0] εως x[pos-1], τότε print(χ[],pos+1,n);//βρες τους συνδιασμούς για την επόμενη θέση pos+1 } } else { //ολες οι n θέσεις υπολογιστηκαν τυπωσε απο x[0] εως x[n-1] } }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.