Programowanie C++
Olunia: Bardzo proszę o pomoc .Mam do napisania program rekurencyjnego podoszenia do potęgi , a dopiero
zaczynam nauke programowania .
Jak w oparciu o schemat zbudowac program ?
if (n = 1) then
return a
if (n mod 2 = 0) then
p =Potega(a, n/2) return p · p
else
p =Potega(a,(n − 1)/2) return p · p · a
undefined
29 maj 19:43
52: A już coś zrobiłaś ? Masz już jakiś kod ?
29 maj 19:45
Olunia: #include <iostream>
using namespace std;
int main ()
{ int n ;
cin>> n;
if { n=1
then
cout << "Twoja liczba to :" <<endl;
}
undefined
29 maj 19:52
52: Ok, zacznijmy od początku piszemy w C++?
Jeśli tak, to nie ma czegoś takiego jak 'then' i 'undefined'.
W jakim środowisku piszesz ?
29 maj 19:55
Olunia: Piszę w C++
undefined
29 maj 19:59
Olunia: Zaczynam od :
#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
To 'undefined' dodaje się samo na końcu mojej wypowiedzi
undefined
29 maj 20:07
52: #include <iostream>
using namespace std;
int a=2,n;
int p(int n)
{
if(n==1)
{
return a;
}
else
{
return p(n−1)*a;
}
}
int main ()
{
cin >> n;
cout <<p(n);
return 0;
}
29 maj 20:12
29 maj 20:12
Olunia: Tylko miałam korzystac z podwujnej funkcji if i modulo
29 maj 20:27
jc:
To jest dosłowne przepisanie Twojej funkcji
int Potega(int a, int n)}
if (n == 1) return a;
if (n % 2 == 0){
p == Potega(a, n/2);
return p * p;
} else {
p = Potega(a,(n − 1)/2);
return p * p * a;
}
}
Ja bym napisał tak:
int pot(pot a, int n){
int w;
if( !n ) return 1;
w=pot(a,n/2);
if ( n&1 ) return w*w*a;
else return w*w;
}
29 maj 20:46
jc: Włącz podkreślanie błędów
29 maj 20:48
Olunia: Co mam poprawic , żeby zadziałał program ? proszę o pomoc ...
#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
int Potega(int a, int n)}
if (n == 1) return a;
if (n % 2 == 0){
p == Potega(a, n/2);
return p * p;
} else {
p = Potega(a,(n − 1)/2);
return p * p * a;
}
return 0;
}
29 maj 20:54
jc: Dużo by pisać... Czy w ogóle napisałaś jakiś działający program?
Zacznij od czegoś prostszego.
29 maj 20:59
Olunia: Tak ale ten musze miec na jutro ...
29 maj 21:05
Olunia: mógłby mi go ktoś napisac ? byłabym bardzo wdzięczna
29 maj 21:09
jc: Tyko to nie ma sensu. Nawet nie poprawiłaś odwróconego nawiasu w pierwszej linii,
#include <iostream>
using namespace std;
int pot(int a, int n){
int w;
if( !n ) return 1;
w=pot(a,n/2);
if ( n&1 ) return w*w*a;
else return w*w;
}
int main ()
{
cout <<pot(3,7) << endl;
return 0;
}
29 maj 21:14
Dziadek Mróz:
Po kolei. Czym jest potęga?
a
0 = 1
a
1 = a
a
n = a*a
n−1 = a*a*a
n−2 = a*a*...*a
0
Jak działa rekurencja?
Do każdej iteracji zwracany jest wynik z poprzedniego wywołania funkcji, a wynik końcowy jest
obliczany na końcu każdej z iteracji:
krok wynik
1)
24 =
2) 2*
23 =
3) 2*2*
22 =
4) 2*2*2*
21 =
5) 2*2*2*2*
20 =
5) 2*2*2*2*
1
4) 2*2*2*
2
3) 2*2*
4
2) 2*
8
1)
16
Zauważ że przy 5−tym kroku wykonaliśmy nawrót, bo wynik się zwraca aż do kroku 1−szego.
Twój 1−szy algorytm jest poprawny, bo to jest pseudokod:
Potega(a, n):
if (n = 1) then
return a # bo a
1 = a
if (n mod 2 = 0) then # gdy n parzysta
p = Potega(a, n/2)
return p · p
else # gdy n nieparzysta
p = Potega(a, (n − 1)/2)
return p · p · a
Wykonajmy eksperyment myślowy dla Twojego algorytmu:
dla a = 2 i n = 4
1) Potega(2, 4):
4 = 1 N
4%2 = 0 T
2) p = Potega(2, 4/2) = Potega(2, 2):
2 = 1 N
2%2 = 0 T
3) p = Potega(2, 2/2) = Potega(2, 1):
1 = 1 T
3) return a = 2
2) return p * p = 2 * 2 = 4
1) return p * p = 4 * 4 = 16
dla a = 2 i n = 5
1) Potega(2, 5):
5 = 1 N
5%2 = 0 N
2) p = Potega(2, (5−1)/2) = Potega(2, 2):
2 = 1 N
2%2 = 0 T
3) p = Potega(2, 2/2) = Potega(2, 1):
1 = 1 T
3) return a = 2
2) return p * p = 2 * 2 = 4
1) return p * p * a = 4 * 4 * 2 = 16 * 2 = 32
Teraz zapiszmy algorytm w Twoim języku programowania, czyli c++:
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
#include <iostream>
int Potega(int a, int n) {
std::cout << "Potega(" << a << ", " << n << ")\n";
if (n == 1) {
return a;
}
if (n%2 == 0) {
int p = Potega(a, n/2);
return p*p;
}
else {
int p = Potega(a, (n−1)/2);
return p*p*a;
}
}
int main(int argc, char **argv) {
std::cout << "Potega(2, 4) = " << Potega(2, 4) << "\n";
std::cout << "Potega(2, 5) = " << Potega(2, 5) << "\n";
return 0;
}
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
https://pastebin.com/eKYTurja
30 maj 16:44