Die Aufgabenstellung finden Sie hier.
Der Ruf der beiden Funktionen (rekursive und iterativ) in der unten dargestellten Reihenfolge funktioniert problemlos. Die umgekehrte Reihenfolge allerdings nicht - die zweite Funktion gibt kein Ergebnis mehr aus (wenn beide Funktionen die Variable zahl erhalten würden). Das liegt daran, dass Fortran Parameter als Call-by-Reference übergibt, dh. innerhalb der Funktionen können Parameter geändert werden. Das Hauptprogramm bekommt diese Änderungen mit! Dh. wir zerstören effektiv den auf zahl gespeicherten Wert in der Funktion backwards_it! Wenn Sie sich dagegen schützen wollen, verwenden Sie das Attribut PARAMETER (oder INTENT(IN)) bei der Variablendeklaration im Unterprogramm, was die Variable konstant setzt. Dann können Sie innerhalb der Funktion den Wert nicht verändern.
program main implicit none integer :: zahl = 0, z2 integer :: backwards, backwards_it integer :: q1, q2 write (*,"(A,$)") "Bitte eine Zahl eingeben: " read (*,*) zahl z2 = zahl q1 = backwards ( zahl ) write (*,*) "" q2 = backwards_it ( zahl ) write (*, "(/A,I5,I5)") "Quersummen: ", q1, q2 end program ! rekursive Lösung recursive integer FUNCTION backwards ( zahl ) result (erg) implicit none integer zahl integer tmp if (zahl > 0) then tmp = mod(zahl, 10) write (*,"(I2,$)") tmp erg = tmp + backwards ( zahl / 10 ) return endif erg = 0 end function ! iterative Lösung integer FUNCTION backwards_it ( zahl ) result (erg) implicit none integer zahl integer tmp erg = 0; do while (zahl > 0) tmp = mod(zahl, 10) write (*,"(I2,$)") tmp erg = erg + tmp zahl = zahl / 10 enddo return end function