01/10/2018, 09:54

Check lỗi code C/C++

pro nào chỉ e lỗi sai với, e suy nghĩ hoài mà k ra, đề bài bắt buộc sự dụng đệ quy. Cảm ơn mọi người!
//s(x,n)=1 + x + x^3/3! + x^5/5! +…+ x^2n+1/2n+1!

#include "conio.h"
#include "stdio.h"
#include "math.h"
float luythua(float x, int n)
{
	if (n == 0)
		return 1;
	return luythua(x, n - 1)* pow(x, 2 * n + 1);
}
float giaithua(int n)
{
	if (n == 0)
		return 1;
	return giaithua(n - 1)*n;
}
float ltchiagt(float x, int n)
{
	if (n == 0)
		return 1;
	return ltchiagt(x, n - 1) + ((luythua(x, n - 1)* pow(x, 2 * n + 1)) / (giaithua(2*n)*(2 * n + 1)));
}
int main()
{
	float kq = ltchiagt(4, 3);
	printf("ket qua =%f", kq);
	getch();
    return 0;
}
HK boy viết 11:57 ngày 01/10/2018

Format lại code nhé. Thêm 3 dấu ` vào đầu và cuối code.
Bài này thì bạn đệ quy giai thừa thôi nhé. Còn S(x, n) không cần đệ quy, chỉ cần vòng lặp thôi.

Nguyen Trong Dung viết 12:09 ngày 01/10/2018

phần lũy thừa, mình nghĩ chỗ đệ quy sẽ là :
return luythua (x,n-1)*x;

Tho Le Duc viết 11:54 ngày 01/10/2018

theo mình thì luythua (x,n-1)x thi mỗi lần mũ của x chỉ tăng lên 1 giá trị—> vd: n=0–>1, n=1–>> 1x=x, n=2–> x*x=x^2,…->>>>> sai.
Đề bài là sau mỗi lần số mũ tăng 2n+1 lần.

Tho Le Duc viết 12:06 ngày 01/10/2018

Sử dụng vòng lặp như bạn cũng được nhưng đề bài yêu cầu sử dụng đệ quy nhị phân để giải.

Mình nghĩ code trên sai ở ltchiagt mà chưa biết phải sửa sao.

HK boy viết 12:07 ngày 01/10/2018

À, thế thì đệ quy nhị phân sẽ ở hàm số mũ.
somu(n, k) = somu(n/2, k) * somu(n/2, k) * somu(n%2, k).

Tho Le Duc viết 12:00 ngày 01/10/2018

Bạn có thể giải thích rõ hơn cho mình hàm này được không, có vd minh họa càng tốt.
Nếu được thì trong bài tập này mình nên sử dụng hàm này như thế nào.

HK boy viết 12:08 ngày 01/10/2018

Giải thích hàm nhé:

n^k = n^(2a + b) = n^(2a) * n^b = (n^a)^2 * n^b (a = k/2, b = n%2)
-> somu(n, k) = somu(n, a) * somu(n, a) * somu(n, b)
hay somu(n, k) = somu(n, n/2) * somu(n, n/2) * somu(n, n%2)

Hàm somu(n, k) là hàm đệ quy, hàm này return somu(n, n/2) * somu(n, n/2) * somu(n, n%2)

rogp10 viết 12:10 ngày 01/10/2018

n^(2k) = (n^k)^2 = n^k * n^k (* n^0)
n^(2k+1) = n^(2k)*n = n^k * n^k * n

Văn Dương viết 11:58 ngày 01/10/2018

Hàm tính lũy thừa bạn viết sai rồi, dùng đệ quy mà lại dùng hàm Pow (pow là hàm tính lũy thừa luôn rồi còn gì )
Phải return luythua(x, n - 1)* x

Tho Le Duc viết 12:00 ngày 01/10/2018

minh đang suy nghĩ hàm đê quy nhị phân mũ theo một sô bạn gợi ý, đã sửa lại theo ý bạn.Kết quả sau khi sửa:

#include "conio.h"
#include "stdio.h"
#include "math.h"
float luythua(float x, int n)
{
	if (n == 0)
		return x;
	return luythua(x, n - 1)* x*x;
}
float giaithua(int n)
{
	if (n == 0)
		return 1;
	return giaithua(n - 1)*n;
}
float ltchiagt(float x, int n)
{
	if (n == 0)
		return 1+x;
	return ltchiagt(x, n - 1) + ((luythua(x, n - 1)* x*x) / (giaithua(2*n)*(2 * n + 1)));
}
int main()
{
	float kq = ltchiagt(5, 6);
	printf("ket qua =%f", kq);
	getch();
    return 0;
}
HK boy viết 12:07 ngày 01/10/2018
  • Hàm luỹ thừa bạn viết sai:
  • Hàm luythua(x, n) dùng để tính x^n -> x^0 = 1, x^1 = x -> phải xét n == 0 và n == 1; bạn xét n == 0 bị sai và bạn chưa xét n == 1.
  • x^n = x^(n-1) * x, không phải = x^(n-1) * x * x.
    Hình như bạn đang hiểu sai bản chất của các hàm luỹ thừa. Hàm này của bạn chưa viết bằng đệ quy nhị phân, bạn mới viết bằng đệ quy tuyến tính.
  • Không cần tính ltchiagt bằng đệ quy. Chỉ cần dùng for là đủ:
for (i=0; i<=n; i++)
    s += luythua(x, (2i+1)) / giaithua(2i+1)
return s
Tho Le Duc viết 12:08 ngày 01/10/2018

Mình đã hiểu rõ hơn về bản chất hàm lũy thừa, cảm ơn bạn đã góp ý, đệ quy nhị phân mình vẫn chưa hình dung ra cách code, điều kiện dừng, bạn có thể code vd minh họa cho bài tập này được không. Code đệ quy tuyến tính đã sửa:

#include "stdio.h"
#include "math.h"
float luythua(float x, int n)
{
	if (n == 0)
		return 1;
	if (n == 1)
		return x;
	return luythua(x, n - 1)* x;
}
float giaithua(int n)
{
	if (n == 0)
		return 1;
	return giaithua(n - 1)*n;
}
float tong(float x, int n)
 {
	float s = 1;
	for (int i = 0; i <= n; i++)
	{
		s += (luythua(x, (2 * i + 1)) / giaithua(2 * i + 1));
	}
		return s;
}
int main()
{
	float kq = tong(5, 6);
	printf("ket qua =%f", kq);
	getch();
    return 0;
}
HK boy viết 12:10 ngày 01/10/2018

Đệ quy nhị phân:

  • ĐK dừng: n=0, n=1
  • Hàm: luythua(x, n) = luythua(x, n/2) * luythua(x, n/2) * luythua(x, n%2)
    Bạn đọc lại các cmt trước.
Tho Le Duc viết 12:03 ngày 01/10/2018

Mình đã hiểu ra vấn đề, cảm ơn bạn nhé. Trả bài đệ quy nhị phân:

#include "conio.h"
#include "stdio.h"
#include "math.h"
float luythua(float x, int n)
{
	if (n == 0)
		return 1;
	if (n == 1)
		return x;
	return luythua(x,n/2)*luythua(x,n/2)*luythua(x,n%2);
}
float giaithua(int n)
{
	if (n == 0)
		return 1;
	return giaithua(n - 1)*n;
}
float tong(float x, int n)
{
	float s = 1;
	for (int i = 0; i <= n; i++)
	{
		s += luythua(x, 2*i+1) / giaithua(2 * i + 1);
	}
	return s;
}
int main()
{
	float kq = tong(4, 6);
	printf("ket qua =%f", kq);
	getch();
	return 0;
}
Bài liên quan
0