2016-04-28 46 views
-2

我在編程上並不是一個新手,我已經編程了近三年了。但我仍然對理解和設計遞歸程序感到沮喪。有時我需要寫下整個過程,這需要花費很多時間。 說這個節目: 轉換排序數組平衡二叉搜索樹設計一個遞歸程序

TreeNode* sortedArrayToBST(vector<int>& nums) { 
     return help(nums, 0, nums.size()-1); 
    } 

    TreeNode* help(vector<int> &nums, int start, int end){ 
     int size=end-start; 
     if(size<0) return NULL; 
     if(size==0) return new TreeNode(nums[start]); 
     int mid=(start+end)/2; 
     TreeNode* root=new TreeNode(nums[mid]); 
     root->left=help(nums, start, mid-1); 
     root->right=help(nums, mid+1, end); 
     return root; 
    } 

我有一個非常困難的時間跟蹤對樹的形式....而且我絕對不能設計一個這樣的程序我自己。我已經看過30個遞歸程序,我知道我需要多練習以熟悉它。只是想知道當您設計遞歸程序時您的思維過程如何,以及您如何快速理解遞歸程序。 很多很多謝謝!

+1

你的問題是關於如何遞歸編程還是它是什麼特定的? –

+0

試着先理解階乘函數。 https://en.wikipedia.org/wiki/Recursion_%28computer_science%29 – Matsmath

+0

這是關於如何遞歸編程,我只是用這個問題作爲例子 –

回答

3

當你處理遞歸你需要保持4個幾點:

  • 什麼是定義當前的狀態參數。
  • 什麼是結束條件(s)。
  • 調用返回什麼。
  • 如何將遞歸調用的結果合併爲當前調用的答案。

在你提到的情況下。

  • 參數是列表的一部分(開始,結束)的座標。
  • 結束條件:如果列表中有一個元素返回一個只包含該元素的樹,則返回null。
  • 返回結果:根完全構建的平衡樹表示參數列表的部分。
  • 如何合併結果:拾取中間點並將其作爲樹的根。將左側子項設置爲起點和中間點之間的子樹的樹根(該列表的遞歸調用)。將右側子項設置爲中間點和列表末尾之間的子樹的樹根(遞歸調用該列表)。

只要你清楚這4點,大多數遞歸問題就變得簡單了。如果你想改善它,你需要練習更多涉及遞歸的問題。