亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用尾遞歸求鏈表和,依然會出現堆棧溢出的情況

用尾遞歸求鏈表和,依然會出現堆棧溢出的情況

拉風的咖菲貓 2018-09-02 10:15:24
問題描述有一個例子,給定一個鏈表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));     }當鏈表中的元素足夠大時,兩種遞歸的方法都會報堆棧溢出,為什么?如何優化尾遞歸,避免堆棧溢出?
查看完整描述

2 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

jvm 好像本來就不支持 TCO 吧?很長時間不看 java 了,如有錯誤,還望指正。

你可以用 python 試試,應該沒什么問題。


查看完整回答
反對 回復 2018-09-02
?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

寫成尾遞歸的形式,并沒有什么用,要真正的實現優化,還需要編譯器中加入了對尾遞歸優化的機制。很顯然java編譯器沒有對尾遞歸的代碼進行編譯優化。

查看完整回答
反對 回復 2018-09-02
  • 2 回答
  • 0 關注
  • 887 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號