delphi4arab منتديات دلفي للعرب

نسخة كاملة : دالة التباديل !
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة الله وبركاته ,,

قبل شهر او شهرين تقريبا كنت قد كتبت دالة التباديل ,,

لكن واجهة إشكال فيها لاحظوا الدالة :

PHP كود :
Function nPr ( n,r:integer) : Integer ;
var 
i :integer;
begin
 Result 
:= 1 ;
  for 
i :=  r  DownTo 1 do begin
   Result 
:= Result*n*(n-1);
   
n := n-2 ;
  
end;
 
Application.MainForm.Caption := ( ' Ans := '+ IntToStr(Result) );
end; 

هذا ما اعتقده صحيح ولكن لم تجدي نفعا ,,

لا اعرف كيف لكن قسمت r على 2 ,, وأصبحت الدالة هكذا :

PHP كود :
Function nPr ( n,r:integer) : Integer ;
var 
i :integer;
begin
 Result 
:= 1 ;
  for 
i :=  ( r div 2 )  DownTo 1 do begin
   Result 
:= Result*n*(n-1);
   
n := n-2 ;
  
end;
 
Application.MainForm.Caption := ( ' Ans := '+ IntToStr(Result) );
end; 

فأصبحت الدالة تعمل بشكل صحيح إذا كان r ( الدليل ) عددا زوجياً

لا أعرف ما المشكلة !؟؟؟


==================

ولمن لا يعرف التباديل ,, سأشرحها باختصار

لو قلنا 5 تباديل 2 = 5 × 4

5 تباديل 3 = 5 × 4 × 3

6 تباديل 2 = 6 ×5

وهكذا . . .


والسلام عليكم
وعليكم السلام ورحمة الله وبركاته
طريقة حساب التباديل (أو الترتيبات nPr) وأيضا التوافيق (أو التوفيقات nCr) كما يلي:
PHP كود :
function Fact(n : Integer) : Integer;
var
  
F1 : Integer;
begin
  F1 
:= 1;
  for 
n := 1 to n do F1 := F1 * n;
  
Fact := F1
end
;

function 
nPr(n, r : Integer) : Integer;
begin
  nPr 
:= Fact(n) div Fact(n - r)
end;

function 
nCr(n, r : Integer) : Integer;
begin
  nCr 
:= nPr(n, r) div Fact(r)
end; 
مثال:
PHP كود :
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage
(IntToStr(nPr(StrToInt(Edit1.Text), StrToInt(Edit2.Text))));
end; 
بالتوفيق.
أخي كاش واحد بارك الله فيك ,,

ألا يمكن أن تتم بالمحاولة التي وضعتها ؟

أظن أن كلا الطريقين صحيحين !

أليس كذلك ؟

وشكرا
السلام عليكم الـ factorial باستخدام الـ Recursive
PHP كود :
function Factorial(aNumber: Integer): Integer;
begin
  Result
:= 1; 
  if 
aNumber > 0 then
    Result
:= Factorial(aNumber-1) * aNumber; 
end;