Tải bản đầy đủ (.pdf) (9 trang)

Tut5 solution

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (323.15 KB, 9 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính

KỸ THUẬT LẬP TRÌNH
Bài tập 5 – Tuần 14
Đệ quy, cấp phát động và kiểu con trỏ
Bài tập bắt buộc:
Bài 1. Viết hàm đệ quy để tính tổng các số từ 1 đến n, với n được cho bởi user.
//return the sum 1+ 2+ 3+ ...+ n
int sum(int n)
int sum(int n){
if (n<=0){
return 0;
}else{
return n+sum(n-1);
}
}
Bài 2. Viết hàm đệ quy để viết chương trình tìm giá trị lớn nhất của một mảng số nguyên.
//return the maximum element in a[]
int findmin(int a[], int n)
int findmax(int a[],int n){
if (n==1){
return a[0];
}else{
return (a[n-1]>findmax(a,n-1))?a[n]:findmax(a,n-1);
}
}
Bài 3. Sử dụng hàm đệ quy để viết chương trình đảo ngược một số nguyên.
// with the parameter 12345, it would return 54321
int reverseDigits(int n)
int reverseDigits(int n){


static int s=0;
if((n/10)==0){
return s+n%10;
}else{
s=(n%10+s)*10;
return reverseDigits(n/10);
}
}
Bài 4. Viết chương trình xuất tam giác Pascal ra màn hình. Cụ thể như sau:
• Nhập một số nguyên dương từ bàn phím (lưu vào biến n).

Kỹ thuật lập trình 501127 – HK2/2011-2012

1


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ tḥt Máy tính
• Tính tốn tam giác Pascal đến mức n và lưu vào 1 mảng 2 chiều (Yêu cầu: mảng 2
chiều này phải được cấp phát động vừa đủ với kích thước của tam giác Pascal).
• Xuất mảng 2 chiều này ra màn hình.
Định nghĩa: Tam giác Pascal chứa các hệ số khi khai triển nhị thức Newton (x + 1)n.
Ví dụ: n = 4. Kết quả xuất ra màn hình sẽ là:
1
11
121
1331
14641
#include<iostream>
using namespace std;

void initpascal(int**&a, int n){
a=new int*[n+1];
for(int i=0;ia[i]=new int[i+1];
for(int j=0;ja[i][j]=0;
}
}
}
void tamgiacpascal(int **&a, int n){
for(int i=0;ia[i][0]=a[i][i]=1;
for(int j=1;ja[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
}
void output(int** c, int n) {
for (int i = 0; i < n+1; i++) {
for (int j = 0; j < i+1; j++) {
cout<}
cout<}
}
void deleteMatrix(int** d, int n) {
for (int i = 0; i < n+1; i++) {
delete [] d[i];
}
delete []d;

}
int main() {
int n;
Kỹ thuật lập trình 501127 – HK2/2011-2012

2


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
int** a;
cout<<"Nhap n: ";
cin>>n;
if (n <= 0) {
cout<<"Invalid Input !"<} else {
initpascal(a,n);
tamgiacpascal(a,n);
cout<<"Tam giac pascal: "<output(a, n);
deleteMatrix(a, n);
}
return 0;
}
Bài 5.
#include<iostream.h>
#include <stdlib.h>
#include<time.h>
void output(int** c, int m, int n) {
for (int i = 0; i < m; i++) {

for (int j = 0; j < n; j++) {
cout<}
cout<}
}
void deleteMatrix(int** d, int m) {
for (int i = 0; i < m; i++) {
delete [] d[i];
}
delete []d;
}
void main() {
int m, n;
int** a;
int** b;
cout<<"Input the dimensions of the Matrix : ";
cin>>m>>n;
if (m <= 0 || n <= 0) {
cout<<"Invalid Input !"<} else {
init(a, m, n);
cout<<"The random matrix : "<output(a, m, n);
Kỹ thuật lập trình 501127 – HK2/2011-2012

3


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM

Khoa Khoa ho ̣c & Kỹ thuật Máy tính
transposeMatrix(a, m, n, b);
cout<<"The transposing matrix : "<output(b, n, m);
deleteMatrix(a, m);
deleteMatrix(b, n);
}
}
Hãy hiện thực hàm init() và hàm transposeMatrix() thỏa mãn các yêu cầu sau:
• init(): tạo ra ma trận a (m hàng , n cột) chứa các số nguyên bằng cách cấp phát động
cho biến con trỏ a. Sau đó khởi tạo ma trận a chứa các số nguyên ngẫu nhiên từ 0..9 ( Gợi
ý : sử dụng hàm rand() trong thư viện stdlib.h đã được include sẵn).
• transposeMatrix() : tạo ma trận b (n hàng, m cột) chứa các số nguyên bằng cách
cấp phát động cho biến con trỏ b. Sau đó, tạo ra ma trận chuyển vị của ma trận a và chứa
vào ma trận b.
void init(int**&a, int m, int n){
srand(time(NULL));
a=new int*[m];
for(int i=0;ia[i]=new int[n];
for(int j=0;ja[i][j]=rand()%10;
}
}
}
void transposeMatrix(int **a, int m,int n, int **&b){
b=new int*[n];
for(int i=0;ib[i]=new int[m];
for(int j=0;j

b[i][j]=a[j][i];
}
}
}
Bài 6. Viết chương trình giải bài tốn tháp Hà Nội.
Mơ tả: Dạng thường gặp nhất của trị chơi này gồm một bộ các đĩa kích thước khác nhau,
có lỗ ở giữa, nằm xuyên trên ba cái cọc. Bài toán đố bắt đầu bằng cách sắp xếp các đĩa
theo trật tự kích thước vào một cọc sao cho đĩa nhỏ nhất nằm trên cùng, tức là tạo ra một
dạng hình nón. u cầu của trị chơi là di chuyển toàn bộ số đĩa sang một cọc khác, tuân
theo các quy tắc sau:
 một lần chỉ được di chuyển một đĩa
 một đĩa chỉ có thể được đặt lên một đĩa lớn hơn (khơng nhất thiết hai đĩa này phải
có kích thước liền kề, tức là đĩa nhỏ nhất có thể nằm trên đĩa lớn nhất)

Kỹ thuật lập trình 501127 – HK2/2011-2012

4


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
(Tham khảo : )
#include<iostream>
using namespace std;
void thapHN(int n, int i, int j){
int k;
if(n==1)
cout<else {
k = 6-i-j;

thapHN(n-1,i,k);
thapHN(1,i,j);
thapHN(n-1,k,j);
}
}
int main()
{
int sotang ;
cout << "So tang = " ;
cin >> sotang;
thapHN(sotang, 1, 2);
return 0;
}
Bài tập làm thêm
Bài 7. Viết hàm đệ quy sumEvenDigit(int n) thực hiện chức năng sau:
• Trả về -1 nếu n < 0.
• Trả về tổng của các chữ số chẵn của số n nếu n >= 0.
Ví dụ : n = 1468952 thì kết quả là : 4 + 6 + 8 + 2 = 20.
int sumEvenDigit(int n){
if (n < 0){
return -1;
}else if(n==0){
return 0;
}else{
return ((n%10)%2==0?n%10:0)+sumEvenDigit(n/10);
}
}
Bài 8. Viết chương trình xuất ra ma trận xoắn ốc. Cụ thể như sau:
• Nhập kích thước của ma trận từ bàn phím (lưu vào 2 biến m, n).
• Tính tốn ma trận xoắn ốc và lưu vào 1 mảng 2 chiều ( Yêu cầu : mảng 2 chiều này

được cấp phát động).

Kỹ thuật lập trình 501127 – HK2/2011-2012

5


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
• Xuất ma trận xoắn ốc ra màn hình.
Định nghĩa: Ma trận xoắn ốc là ma trận chứa đựng các số từ 1..(m x n) được sắp xếp có
thứ tự tăng dần theo hình xoắn ốc.
Ví dụ :
m = 3, n = 5. Kết quả xuất ra màn hinh sẽ là:
12345
12 13 14 15 6
11 10 9 8 7
m = 4, n = 4. Kết quả xuất ra màn hình sẽ là:
1234
12 13 14 5
11 16 15 6
10 9 8 7
#include<iostream>
using namespace std;
void init(int**&a, int m, int n){
a=new int*[m];
for(int i=0;ia[i]=new int[n];
for(int j=0;ja[i][j]=0;

}
}
}
void mtxoanoc(int **&a, int m, int n){
int i,j,istart,jstart,inccol,incrow,max;
i=j=istart=jstart=0;
inccol=1;
incrow=0;
max=m*n;
for(int key=1;key<=max;key++){
a[i][j]=key;
i+=incrow;
j+=inccol;
if(i==istart&&j==jstart){
incrow=0;
inccol=1;
i=j=++istart;
n--;
m--;
}else if(i==istart&&j==n-1){
incrow=1;
inccol=0;
}else if(i==m-1&&j==n-1){
incrow=0;
Kỹ thuật lập trình 501127 – HK2/2011-2012

6


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM

Khoa Khoa ho ̣c & Kỹ thuật Máy tính
inccol=-1;
}else if(i==m-1&&j==jstart){
incrow=-1;
inccol=0;
}else;
}
}
void output(int** c, int m, int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cout<}
cout<}
}
void deleteMatrix(int** d, int m) {
for (int i = 0; i < m; i++) {
delete [] d[i];
}
delete []d;
}
int main() {
int m, n;
int** a;
cout<<"Input the dimensions of the Matrix : ";
cin>>m>>n;
if (m <= 0 || n <= 0) {
cout<<"Invalid Input !"<} else {

init(a, m, n);
cout<<"Ma tran zero: "<output(a, m, n);
mtxoanoc(a, m, n);
cout<<"Ma tran xoan oc: "<output(a, m, n);
deleteMatrix(a, m);
}
return 0;
}
Bài 9. Cho đoạn chương trình :
#include <iostream.h>
void printCombinations(int m, int n) {
//Coding here
}
Kỹ thuật lập trình 501127 – HK2/2011-2012

7


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
void main() {
int m,n;
cout<<"Input two positive integer : ";
cin>>m>>n;
if (m <=0 || n <= 0 || m > n) {
cout<<"Invalid input !"<} else {
cout<<"The result is : "<

printCombinations(m,n);
}
}
Hãy hiện thực hàm printCombinations() để sinh ra tất cả các tổ hợp chập m của n
phần tử từ 1..n. Yêu cầu trong hàm printCombinations() phải gọi 1 hàm đệ qui để
thực hiện việc sinh ra tất cả các tổ hợp này.
Ví dụ : m = 2 , n = 4. Kết quả xuất ra màn hình sẽ là:
12
13
14
23
24
34
void generate(int a[], int m, int n, int k){
for(int j=a[k-1]+1;j<=n-m+k;j++){
a[k]=j;
if(k==m){
for (int i=1;i<=m;i++) cout<cout<}else
generate(a,m,n,k+1);
}
}
void printCombinations(int m, int n) {
int k=1;
int a[m+1];
a[0]=0;
generate(a,m,n,k);
}
Bài 10. Bằng cách sử dụng kỹ thuật hàm đệ quy để viết chương trình kiểm tra xem đảo

ngược một chuỗi có phải là chính nó hay khơng.
//returns 1 if a[] is a palindrome, 0 otherwise
int ispalindrome(char a[], int n)
int ispalindrome(char a[], int n){
static int pos=0;

Kỹ thuật lập trình 501127 – HK2/2011-2012

8


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
if(pos>n/2){
return 1;
}else if(a[pos]==a[n-1-pos]){
pos++;
return 1*ispalindrome(a, n);
}else {
return -1;
}
}
Bài 11. Dùng đệ quy để viết chương trình xuất ra một chuỗi mới được tạo thành bởi sao
chép n chuỗi con s.
// with the parameters “Hello” and 2 would return the
string “HelloHello”.
// if n equals zero, the method should return the empty
string.
char* repeat(char* s, int n)
char* repeat(char* s, int n){

static char *s1=new char;
if(n<=0){
s1="";
return s1;
}else if(n==1){
strcat(s1,s);
return s1;
}else{
strcat(s1,s);
return repeat(s,n-1);
}
}
Bài 12. Hiện thực thuật giải tìm ước số chung lớn nhất bằng kỹ thuật đệ quy.
int UCLN(int a, int b){
if (a==b){
return a;
}else if (a>b){
return UCLN(a-b,b);
}else{
return UCLN(b,b-a);
}
}
-- Hết -

Kỹ thuật lập trình 501127 – HK2/2011-2012

9




Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×