有一个例子,给定一个链表
public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }
希望用普通递归和尾递归两种方式计算链表元素之和,并验证当链表元素足够多时,普通递归出现堆栈溢出,而尾递归则不会出现
add0() 方法采用普通递归的方式,add() 方法使用尾递归的方式。
public int add0(ListNode node) { if (node == null) { return 0; } return node.val + add0(node.next); }
public int add(ListNode node, int result) { if(node == null) { return result; } result += node.val; return add(node.next, result); }
测试代码:
public void test() { ListNode node = new ListNode(0); ListNode temp = node; for (int i = 1; i < 1000000; i++) { temp.next = new ListNode(1); temp = temp.next; } System.out.println(add(node, 0));// System.out.println(add0(node)); }
当链表中的元素足够大时,两种递归的方法都会报堆栈溢出,为什么?如何优化尾递归,避免堆栈溢出?
神不在的星期二
撒科打诨
相关分类