30/09/2018, 16:39
Hỏi về 1 đoạn trong code mảng đệ quy: kiểm tra mảng tăng dần?
// kiểm tra mảng có tăng dân fhay không.cpp : Defines the entry point for the console application.
// kiểm tra xem mảng có thứ tự tăng hay không
#include "stdafx.h"
#include <iostream>
using namespace std;
#define MAX 100
// nhập mảng
void nhapmang(int a[], int n)
{
if (n >=0 )
{
nhapmang(a, n - 1);
cout << "phan tu thu a[" << n << "]" << ":";
cin >> a[n];
}
}
// in mảng
void inmang(int a[], int n)
{
if (n >=0)
{
inmang(a, n - 1);
cout << a[n] << " ";
}
}
// kiểm tra
int ktra(int a[], int n){
//n là vị trí phần tử cuối cùng. Tức là khi truyền vào là n-1.
// return 0 nếu dãy ko đổi. return 1 nếu dãy tăng
if (n == 0) // Nếu chỉ có 1 phần tử tức là dãy ko đổi
return 0;
int t= ktra(a, n - 1);
if ((a[n - 1] < a[n] && (t == 0 || t == 1)) || (a[n - 1] == a[n] && t == 1))
return 1;
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[MAX];
int n;
cout << "nhap n=";
cin >> n;
nhapmang(a, n - 1);
inmang(a, n - 1);
int k = ktra(a, n);
if (k == 0)
cout << "mang ko tang" << endl;
else
cout << "mang tang dan" << endl;
return 0;
}
e thắc mắc gán int t= ktra(a, n - 1) để làm gì vậy mấy a
Bài liên quan
Cho em hỏi là code này đã chuẩn chưa, vì khi em nhập mảng kiểu gì nó cũng bào tăng dần
Ah, em đã sửa lại code của anh, chỗ này, vì trong hàm ktra, anh đặt
n
là vị trí phần tử cuối nên anh trong hàm main, anh phải đưa n - 1 vào (vì vị trí đầu tiên luôn là A[o])thành
Bây giờ nó chạy chuẩn rồi ấy
Còn về câu hỏi thì cái
int t= ktra(a, n - 1);
đó chính là đệ quy.Vì vậy, em nghĩ
phải chuyển thành
Có gì sai sót, anh @Gio giúp cái
Sao không return lúc n=1 ấy. Lúc đó có cái nào khác để so sánh tăng giảm đâu. Post code hoàn chỉnh xem
Đã edit n == 1, sửa cái k mà với cái return mà quên mất
n
Mà em giải thích đúng rồi phải không.
Với lại em cảm thấy đâu cần làm rắc rối thế nhỉ
Chú này thích đệ quy
Mà nếu làm đệ quy thì làm thế này cũng được mà phải không
Function Increase(a,n) = n<=1 or (a[n-1]>a[n-2] and increase(a,n-1));
Là sao anh, em chả hiểu gì cả
hàm này trông hư cấu quá nha @nhatlonggunz
Thế mà em test vẫn ngon :v
Thế phần đệ quy đâu? Mà có n phần tử sao lại truy cập a[n] ?
Thì hàm main em gọi ktra(A, n - 1)
Oops, đúng là hư cấu thật
Hàm
return
ghê gớm đến mức độ này à, code này là gì thế ạcode bạn gió dành cho người có kinh nghiệm, mình xin sửa lại code của bạn Long_Long
mỏ neo (tức điều kiện để thoát đệ quy) là số phần tử của mảng chỉ có 1, nó luôn luôn đúng trả về true.
dùng biến tạm kiểu bool có tên flag để tiến hành đệ quy (quay lui để kiểm tra, ví dụ 4 phần tử, thì kiếm tra 3, 3 thì về 2, 2 thì về 1, 1 thì gặp cái mỏ neo trả về true, tức là lúc này biến flag của ta có giá trị true!
Lưu ý lúc này máy tính chưa biết giá trị trả về của hàm đối với 2, 3, 4 phần tử!
Nên ta có cái if phía sau để kiểm tra.
Đầu tiên flag có giá trị true, tức giá trị của hàm lúc mảng có 1 phần tử, máy đi vào hàm if để kiểm tra,
máy sẽ kiểm tra ngược lại lần lượt các mảng 2, 3, và 4 phần tử, tuy nhiên vì trong hàm chưa có điều kiện để kiểm tra hàm 2 hoặc nhiều hơn phần tử, nên ta lồng điều kiện kiểm tra bằng cách so sánh 2 phần tử cuối cùng trong mảng. máy sẽ kiểm tra ngược lại các mảng 2, 3 và 4 phần tử bằng cách này và gán giá trị true hoặc false cho biến flag.
Bằng cách này ta đã kiểm tra được lần lượt toàn bộ các phần tử trong mảng theo kiểu đệ quy.
PS: đó là cách hiểu của mình sau khi debug, các bạn nếu chưa hiểu thì có thể debug step by step bằng F11 trong visual để trực quan hơn.