2015-10-22 1 views
2

J'essaie d'utiliser le concept de récursivité, mais en utilisant pour faire boucle. Cependant, mon programme ne peut pas le faire. Par exemple si je veux la sortie pour 4! la réponse devrait être 24 mais ma sortie est de 12. Quelqu'un peut-il m'aider s'il vous plaît?recursion en utilisant pour faire boucle (pascal)

program pastYear; 

var 
    n,i:integer; 


function calculateFactorial (A:integer):real; 

begin 
    if A=0 then 
    calculateFactorial := 1.0 
    else 
    for i:= A downto 1 do 
    begin 
     j:= A-1; 
     calculateFactorial:= A*j; 
    end; 
    end; 

    begin 
    writeln(' Please enter a number '); 
    readln (n); 
    writeln (calculateFactorial(n):2:2); 
    readln; 
    end. 
+0

'j' n'est pas déclarée nulle part. De plus, 'A' ne change jamais dans votre boucle, donc' j' (de 'j: = A-1' ne change jamais, et, par conséquent,' A * j' ne change jamais.) Votre programme factoriel retourne 'A * (A- 1) '. – lurker

+0

La récursivité serait 'A * calculateFactorial (A-1)', aucune boucle nécessaire. –

+0

Les gars merci de m'aider. J'ai finalement eu la réponse que je cherchais. A propos de la boucle Je sais que nous pouvons faire de la récursivité sans cela mais la question de mon conférencier veut que nous utilisions la boucle, c'est pourquoi. –

Répondre

2

Il existe plusieurs problèmes dans votre code.

  1. d'abord, il ne compile pas parce que vous accédez à la j variable non définie.
  2. Le calcul de la factorielle en utilisant une boucle est la manière itérative de le faire. Vous cherchez le récursive façon.

Qu'est-ce qu'une récursivité? Une fonction récursive s'appelle elle-même. Donc dans votre cas calculateFactorial a besoin d'un appel à lui-même.

Comment la fonction factorielle est-elle déclarée?

enter image description here

En d'autres termes:

La factorielle de n est déclarée comme

  • 1 lorsque n est égal à 0
  • la factorielle de n-1 multipliée par n lorsque n est supérieur t han 0

Vous voyez la définition de la fonction factoriel est déjà récursive car il fait référence à lui-même quand n est supérieur à 0.

Cela peut être adopté au code Pascal:

function Factorial(n: integer): integer; 
begin 
    if n = 0 then 
    Result := 1 
    else if n > 0 then 
    Result := Factorial(n - 1) * n; 
end; 

Non, nous pouvons faire quelques optimisations:

  • La fonction factoriel ne fonctionne pas avec les nombres négatifs. Donc, nous changeons le type de données de integer (qui peut représenter des nombres négatifs) à longword (qui ne peut représenter que des nombres positifs).
  • La plus grande valeur qu'un longword peut stocker est 4294967295, ce qui est deux fois plus grand qu'un longint peut stocker. Maintenant que nous n'avons pas besoin de nous préoccuper des nombres négatifs, nous pouvons réduire une instruction if.

Le résultat ressemble à ceci:

function Factorial(n: longword): longword; 
begin 
    if n = 0 then 
    Result := 1 
    else 
    Result := Factorial(n - 1) * n; 
end; 
+1

Il est possible d'optimiser le code en déclarant le paramètre «n» et le résultat de la fonction comme mot/mot long etc. (> = 0) avec suppression simultanée de «si n> 0 alors» redondant. Il est possible de vérifier si le paramètre est> = 0 une fois sur la ligne où la fonction est appelée en premier. Cependant, j'ai upvote votre réponse –

+0

Merci, j'ai édité la réponse. – Wosi