簡體   English   中英

多次調用一個函數

[英]Calling a function recursively more than once

我是編程新手,請為我解釋以下遞歸函數的工作原理。 該函數被遞歸調用兩次,第一次遞歸調用后的語句是否會執行?

void sort(int low, int high) {
   int mid;

   if(low < high) {
      mid = (low + high) / 2;
      sort(low, mid);
      sort(mid+1, high);
      merging(low, mid, high);
   } else { 
      return;
   }   
}
void main()
{
   sort(0, 10);
}

請參閱堆棧溢出的遞歸示例鏈接。 遞歸函數示例

您想在代碼中實現什么? 遞歸函數應調用函數本身,並且應具有停止條件,否則它將陷入無限循環。 您編寫的代碼兩次調用了相同的函數,這是不正確的。 您應該在停止條件下調用一次該函數。

讓我們逐行走

  1. 首先,您的sort函數將針對參數0和10運行,這將是對該函數的首次調用。
  2. if(low < high)由於0 <10,則mid將為5:因為mid = (low + high) / 2;
  3. 現在再次對參數0和5運行sort函數,這將是對該函數的第二次調用,但請記住,第一個調用仍未完成其工作。
  4. 由於0 <5,則mid將為2。
  5. 現在,sort函數將再次針對參數0和2運行,這將是第三個調用,第二個函數將繼續工作。
  6. 因為0 <2 mid將為1。
  7. 現在,sort函數將再次針對參數0和1運行,這將是第四次調用,並且對該函數的第三次調用將繼續起作用。
  8. 因為0 <1 mid將為0。
  9. 現在,sort函數將再次針對參數0和0運行,這將是第五次調用,並且對該函數的第四次調用將繼續起作用。
  10. 由於現在0 <0為false,則將執行else中的return調用,並且該函數將被銷毀。 現在,控件將返回到第四調用,該調用對args 0低和1高起作用。
  11. 現在從第五行開始sort(mid+1, high); 這次將再次調用您的代碼排序,因為低= 1,高也= 1。
  12. 現在再次調用sort函數,這是第六次調用,這一次它將在args low = 1和high = 1下運行,並且將從代碼的第一行開始執行。

將其視為堆棧,首先推送sort(0,10)然后=> sort(0,5)然后=> sort(0,2)然后=> sort(0,1)然后=> sort(0,0)

現在,既然sort(0,0)完成執行,它將從堆棧中刪除,並且sort(0,1)將繼續。 所以應該看起來像這樣

sort(0,10) => sort(0,5) => sort(0,2) => sort(0,1)

再在第五行sort(0,1)調用sort()在那里,所以再次排序將被推到這個堆棧:

sort(0,10) => sort(0,5) => sort(0,2) => sort(0,1) => sort(1,1)

這將繼續,最后對sort(0,10)的調用將完成執行,您將獲得所需的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM