Avatar billede testpilot_dk Nybegynder
18. september 2005 - 19:58 Der er 14 kommentarer og
1 løsning

rekursiv funktion

hej!

hvorfor kan jeg ikke få denne til at kalde rekursivt

    function GetValue(t)
        if t(0) > 600 OR t(1) > 600 then
            if t(0) > 600 then
                t(0) = t(0) / 2
                t(1) = t(1) / 2
                GetValue(t)
            else
                t(0) = t(0) / 2
                t(1) = t(1) / 2
                GetValue(t)
            end if
        end if
    end function

Den bliver kun kaldt en gang. dvs at hvis jeg har nogle tal som hedder 1500 og 1300, så bliver resultate kun 750 og 650
Avatar billede nielle Nybegynder
18. september 2005 - 20:34 #1
Prøv at sætte ByRef på, og så skal det desuden være en Sub i stedet for en Function eftersom den ikke har et retur-resultat:

sub GetValue(ByRef t)
    if t(0) > 600 OR t(1) > 600 then
        if t(0) > 600 then
            t(0) = t(0) / 2
            t(1) = t(1) / 2
            GetValue(t)
        else
            t(0) = t(0) / 2
            t(1) = t(1) / 2
            GetValue(t)
        end if
    end if
end sub


BTW. Du er vel klar over adt de to blokke i den indre if-then-else begge to gør det samme...
Avatar billede testpilot_dk Nybegynder
18. september 2005 - 22:18 #2
Hej!

Get vil jeg prøve, jo det er jeg komme i tanke om det med mine if sætninger
Avatar billede testpilot_dk Nybegynder
19. september 2005 - 12:53 #3
Jeg kan simpelthen ikke få den til at kalde rekursivt!

Kan det overhovedet lade sig gører i VBScript ???

Den løber kun i funktionen en gang og afslutter
Avatar billede nielle Nybegynder
19. september 2005 - 14:53 #4
Selvfølgeligt kan man kalde rekursivt i ASP/VBScript.

Tid til at prøve med lidt debug-kode:

sub GetValue(ByRef t)
    Response.Write "DEBUG: GetValue kaldt<br>"
    Response.Write "DEBUG: t0=" & t(0) & ", t1=" & t(1) & "<br>"

    if t(0) > 600 OR t(1) > 600 then
        if t(0) > 600 then
            t(0) = t(0) / 2
            t(1) = t(1) / 2
            GetValue(t)
        else
            t(0) = t(0) / 2
            t(1) = t(1) / 2
            GetValue(t)
        end if
    end if
end sub

Hvad bliver der udskrevet?
Avatar billede testpilot_dk Nybegynder
20. september 2005 - 07:11 #5
Hej!

Den skriver dette

1400
1650
DEBUG: GetValue kaldt
DEBUG: t0=1400, t1=1650
DEBUG: GetValue kaldt
DEBUG: t0=700, t1=825
DEBUG: GetValue kaldt
DEBUG: t0=350, t1=412,5
1400
1650

De 2 sidste er hvad jeg får efter min Sub, hvorfor er de ikke ændret også ??

ASP koden ser sådan ud

sub GetValue(ByRef t)
    Response.Write "DEBUG: GetValue kaldt<br>"
    Response.Write "DEBUG: t0=" & t(0) & ", t1=" & t(1) & "<br>"

    if t(0) > 600 OR t(1) > 600 then
        if t(0) > 600 then
            t(0) = t(0) / 2
            t(1) = t(1) / 2
            GetValue(t)
        else
            t(0) = t(0) / 2
            t(1) = t(1) / 2
            GetValue(t)
        end if
    end if
end sub

    dim values
    values = split("1400,1650", ",")
   
        Response.Write(values(0))
    Response.Write("<br>")
    Response.Write(values(1))
    Response.Write("<br>")
    GetValue(values)

    Response.Write(values(0))
    Response.Write("<br>")
    Response.Write(values(1))
Avatar billede nielle Nybegynder
20. september 2005 - 08:45 #6
"sjovt" :^|

Prøv lige denne her variant:

sub GetValue(ByRef t)
    Response.Write "DEBUG #1: GetValue kaldt<br>"
    Response.Write "DEBUG #2: t0=" & t(0) & ", t1=" & t(1) & "<br>"

    if t(0) > 600 OR t(1) > 600 then
        if t(0) > 600 then
            t(0) = t(0) / 2
            t(1) = t(1) / 2
            GetValue(t)
        else
            t(0) = t(0) / 2
            t(1) = t(1) / 2
            GetValue(t)
        end if
    end if

    Response.Write "DEBUG #3: t0=" & t(0) & ", t1=" & t(1) & "<br>"
end sub
Avatar billede testpilot_dk Nybegynder
20. september 2005 - 09:05 #7
Hvordan får jeg så mine værdier ud fra Sub

Jeg vil gerne kunne benytte dem senere i koden
Avatar billede nielle Nybegynder
20. september 2005 - 10:23 #8
Det var jo det ByRef skulle gøre for dig.

Hvad får du udskrevet når du køre 20/09-2005 08:45:55?
Avatar billede testpilot_dk Nybegynder
20. september 2005 - 10:28 #9
Hej!

Jeg har ikke prøvet den fra 8:45 endnu, mit hotel er nede, så det bliver først i eftermiddag!
Avatar billede testpilot_dk Nybegynder
20. september 2005 - 17:45 #10
Nu får jeg følgende output

1400
1650
DEBUG #1: GetValue kaldt
DEBUG #2: t0=1400, t1=1650
DEBUG #1: GetValue kaldt
DEBUG #2: t0=700, t1=825
DEBUG #1: GetValue kaldt
DEBUG #2: t0=350, t1=412,5
DEBUG #3: t0=350, t1=412,5
DEBUG #3: t0=350, t1=412,5
DEBUG #3: t0=700, t1=825
1400
1650
Avatar billede nielle Nybegynder
20. september 2005 - 18:08 #11
Jeg er godt nok lidt blank på hvad der kan være galt.

Men prøv i det mindste at bruge den rette kalde-notation:

sub GetValue(ByRef t)
    Response.Write "DEBUG: GetValue kaldt<br>"
    Response.Write "DEBUG: t0=" & t(0) & ", t1=" & t(1) & "<br>"

    if t(0) > 600 OR t(1) > 600 then
        if t(0) > 600 then
            t(0) = t(0) / 2
            t(1) = t(1) / 2
            Call GetValue(t)
        else
            t(0) = t(0) / 2
            t(1) = t(1) / 2
            Call GetValue(t)
        end if
    end if
end sub

dim values
values = split("1400,1650", ",")
   
Response.Write(values(0))
Response.Write("<br>")
Response.Write(values(1))
Response.Write("<br>")

Call GetValue(values)

Response.Write(values(0))
Response.Write("<br>")
Response.Write(values(1))
Avatar billede testpilot_dk Nybegynder
20. september 2005 - 18:32 #12
Det virker! fantastisk! send et svar, du har virkelig fortjent disse point!

Kan jeg så også runde mine tal op, når jeg har haft dem igennem min Sub altså inden jeg skriver dem ud anden gang ??
Avatar billede nielle Nybegynder
20. september 2005 - 18:38 #13
ASP/VBScript har en afrunding-funktion:

F.eks. gælder der at:

Round(2.987, 2) = 2.99

- i det 2-tallet betyder at der rundes af med 2 decimaler.
Avatar billede nielle Nybegynder
20. september 2005 - 18:38 #14
... og et svar :^)
Avatar billede testpilot_dk Nybegynder
20. september 2005 - 18:47 #15
Mange takker, men så har jeg jo lært noget nyt, at man skal skrive call foran kald til Subs!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester