Does PHP optimize tail recursion?

后端 未结 3 1579
不知归路
不知归路 2020-12-03 02:58

I wrote a small piece of code that I believe should have succeeded if tail recursion was optimized, however it blew up the stack. Should I conclude PHP does not optimize tai

3条回答
  •  醉话见心
    2020-12-03 03:24

    Here are the generated opcodes for that (sorry for the strange representation):

    Global
    -------------------------------------------------------------------------------
    BCDCAC 0003: NOP                  ()
    BCDD24 0012: SEND_VAL             (CONST: "500000")
    BCDD9C 0012: SEND_VAL             (CONST: NULL)
    BCDE14 0012: DO_FCALL             (CONST: "sumrand") -> VAR 0
    BCDE8C 0012: CONCAT               (VAR 0, CONST: "\n") -> TMP_VAR 1
    BCDF04 0012: ECHO                 (TMP_VAR 1)
    BCDF7C 0014: RETURN               (CONST: "1")
    
    Functions
    -------------------------------------------------------------------------------
    sumrand (17 op)
    BCFABC 0003: RECV                 (CONST: "1") -> CV 0 ($n)
    BCFB34 0003: RECV                 (CONST: "2") -> CV 1 ($sum)
    BCFBAC 0004: IS_EQUAL             (CV 0 ($n), CONST: NULL) -> TMP_VAR 0
    BCFC24 0004: JMPZ                 (TMP_VAR 0, &(BCFD18+6))
    BCFC9C 0005: RETURN               (CV 1 ($sum))
    BCFD14 0006: JMP                  (&(BD01C8+10))
    BCFD8C 0008: INIT_FCALL_BY_NAME   (NULL, CONST: "sumrand")
    BCFE04 0008: SUB                  (CV 0 ($n), CONST: "1") -> TMP_VAR 1
    BCFE7C 0008: SEND_VAL             (TMP_VAR 1)
    BCFEF4 0008: SEND_VAL             (CONST: NULL)
    BCFF6C 0008: SEND_VAL             (CONST: "1")
    BCFFE4 0008: DO_FCALL             (CONST: "rand") -> VAR 2
    BD005C 0008: ADD                  (CV 1 ($sum), VAR 2) -> TMP_VAR 3
    BD00D4 0008: SEND_VAL             (TMP_VAR 3)
    BD014C 0008: DO_FCALL_BY_NAME     () -> VAR 4
    BD01C4 0008: RETURN               (VAR 4)
    BD023C 0010: RETURN               (CONST: NULL)
    

    So, no, it certainly doesn't seem so.

提交回复
热议问题