julia> function fib1(n) if n==1 return n else return n+fib1(n-1) end end fib1 (generic function with 1 method) julia> function fib2(n,s) if n == 1 return s+1 else return fib2(n-1,s+n) end end fib2 (generic function with 1 method) julia> fib1(10) 55 julia> fib2(10) ERROR: MethodError: no method matching fib2(::Int64) Closest candidates are: fib2(::Any, ::Any) at REPL[18]:2 julia> fib2(10,0) 55 julia> fib2(20) ERROR: MethodError: no method matching fib2(::Int64) Closest candidates are: fib2(::Any, ::Any) at REPL[18]:2 julia> fib2(20,0) 210 julia> fib1(20) 210 julia> time(fib1(100)) ERROR: MethodError: no method matching time(::Int64) Closest candidates are: time() at libc.jl:206 time(::Base.Libc.TmStruct) at libc.jl:205 julia> @time(fib1(100)) 0.000005 seconds (131 allocations: 7.734 KB) 5050 julia> @time(fib2(100,0)) 0.000007 seconds (5 allocations: 176 bytes) 5050 julia> @time(fib1(500)) 0.000005 seconds (5 allocations: 176 bytes) 125250 julia> @time(fib2(500,0)) 0.000010 seconds (5 allocations: 176 bytes) 125250 julia> @time(fib1(1000)) 0.000022 seconds (5 allocations: 176 bytes) 500500 julia> @time(fib2(1000,0)) 0.000009 seconds (5 allocations: 176 bytes) 500500 julia> @time(fib1(10000)) 0.000325 seconds (5 allocations: 176 bytes) 50005000 julia> @time(fib2(10000,0)) 0.000095 seconds (5 allocations: 176 bytes) 50005000
julia> code_native(fib1,(Int64,))
.text
Filename: REPL[17]
pushq %rbp
movq %rsp, %rbp
pushq %rsi
subq $40, %rsp
movq %rcx, %rsi
Source line: 2
cmpq $1, %rsi
jne L30
Source line: 3
movl $1, %eax
addq $40, %rsp
popq %rsi
popq %rbp
retq
Source line: 5
L30:
leaq -1(%rsi), %rcx
movabsq $fib1, %rax
callq *%rax
addq %rsi, %rax
addq $40, %rsp
popq %rsi
popq %rbp
retq
nopl (%rax,%rax)
julia> code_native(fib2,(Int64,Int64))
.text
Filename: REPL[18]
pushq %rbp
movq %rsp, %rbp
Source line: 2
subq $32, %rsp
cmpq $1, %rcx
jne L26
Source line: 3
incq %rdx
movq %rdx, %rax
addq $32, %rsp
popq %rbp
retq
Source line: 5
L26:
addq %rcx, %rdx
decq %rcx
movabsq $fib2, %rax
callq *%rax
addq $32, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
尾递归版应该是有优化的啊,为什么内存和执行时间都没明显差别?