Suites à récurrence double

 

Nous sommes parfois amenés à travailler sur des suites qui dépendent d'autres suites. Ainsi, dans l'exemple suivant, la suite u dépend de la suite v, qui elle dépend de u. Nous pouvons facilement réaliser le programme permettant de calculer les n-ièmes termes de ces deux suites, mais d'un point de vue algorithmique, cela nous amène à programmer une récursivité croisée; en effet, la fonction "u" appelle la fonction "v", cette dernière appelant "u".

Voici la définition des deux suites, suivie du programme;

u(0)=1, v(0)=2 et, pour tout entier naturel n :

u(n+1)=3u(n)+2v(n)

v(n+1)=2u(n)+3v(n)

Remarques :

1) la suite u-v est constante égale à 1.

2) Comme la fonction "v" est définie après "u", cela nous amène à utiliser le mot "forward".

 

function v(n: integer): int64; forward;
 
function u(n: integer): int64;
begin
  if n = 0 then result := 1 //condition de sortie de la récursion
  else result := 3 * u(n - 1) + 2 * v(n - 1);
end;
 
function v;
begin
  if n = 0 then result := 2 //condition de sortie de la récursion
  else result := 2 * u(n - 1) + 3 * v(n - 1);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
  Screen.Cursor := crHourGlass;
  Memo1.Clear;
  for i := 0 to SpinEdit1.Value - 1 do
  begin
    Memo1.Lines.Add('u(' + IntToStr(i) + ') = ' + IntToStr(u(i)));
    Memo1.Lines.Add('v(' + IntToStr(i) + ') = ' + IntToStr(v(i)));
    Memo1.Lines.Add(' ');
  end;
  Screen.Cursor := crDefault;
end;

 

Télécharger le code source Delphi