初学的难主要还是缺乏可视化的手段吧,还有一个是用递归模拟迭代的多参数混乱。可以看下类似 https://dmytrobaida.github.io/recursion-viewer/ 的工具,然后自己写的时候可以打印点日志,打印的方式是递归方法入口先打印 indent (比如说是 2 个空格)* 递归深度(递归深度作为参数传入)然后方法名加各个参数信息。打印内容可能是类似下面这样
```
|fib(5)
| |fib(4)
| | |fib(3)
| | | |fib(2)
| | | |2
| | | |fib(1)
| | | |1
| | |3
| | |fib(2)
| | |2
| |5
| |fib(3)
| | |fib(2)
| | |2
| | |fib(1)
| | |1
| |3
|8
```
这个的源码大概是这样:
```scala
def fib(n: Int, depth: Int = 0): Int =
println(s"""${"| " * depth}|fib($n)""")
if n <= 2 then
println(s"""${"| " * depth}|$n""")
n
else
val r = fib(n - 1, depth + 1) + fib(n - 2, depth + 1)
println(s"""${"| " * depth}|$r""")
r
val res = fib(5)
```
当然,你也可以想办法把这个功能做成装饰器 |