假设A是一个数组,n是A中的元素数,
recursive_insertion_sort(A, n)
IF n > 1 THEN
recursive_insertion_sort(A, n-1)
key = A[n]
i = n - 1
DOWHILE A[i] > key AND i > 0
A[i+1] = A[i]
i = i - 1
ENDDO
A[i+1] = temp
ENDIF
END
在这种情况下,有人可以解释递归是如何工作的吗?有几点我不明白:
答案 0 :(得分:6)
在讨论实现之前,让我们解释一下这个函数的用途:它不会对整个数组A
进行排序,而只对它的初始n
元素进行排序。您可以传递n
数组的长度来对整个事物进行排序,但是您分别传递长度这一事实对于理解答案的其余部分至关重要。
我不明白为什么我们必须在
n > 1
时再次调用该函数。
也许更好的方法来解释这种情况的含义是,当n
为1或更小时,我们不再次调用此函数。这被称为递归算法的基本情况,即您不必做任何事情的情况。在排序的情况下,它意味着只有一个元素的数组已经被排序。
为什么我们再次调用函数时输入
(n-1)
?
由于n
是我们需要排序的元素数,因此我们通过n-1
对数组的前面进行排序。函数返回后,我们知道部分A[1..n-1]
已经排序。我们所要做的就是将A[n]
移到正确的位置。我们在随后的DOWHILE
循环中执行此操作:我们一次向后移动一个元素,向右移动大于A[n]
的元素。循环结束后,我们将A[n]
放置到新位置。现在范围A[1..n]
已排序。
一般如何递归递归?
该函数有两种情况 - 简单的基本情况,当一切都完成时,还原步骤,当你使用递归调用来解决一个更简单的问题,然后使用更简单的解决方案的结果来构建你的最终解决方案。
一旦我们再次调用该函数,我们是否会忽略第4行以后的代码,并直接跳转到第二个调用?
不,一旦函数返回,我们继续我们离开的地方。在您的情况下,在将A[1..n-1]
放置到正确的位置之前,该函数会等待A[n]
范围进行排序。
答案 1 :(得分:3)
了解其工作原理的小例子:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.actualite);
// Initializing
toolbar = (Toolbar) findViewById(R.id.toolbar);
button_popup_actu = (Button) findViewById(R.id.show_list_news);
button_popup_actu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupMenu popup = new PopupMenu(News.this, button_popup_actu);
popup.getMenuInflater().inflate(R.menu.popup_menu_news, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(News.this, "You Clicked : " + item.getTitle(), Toast.LENGTH_SHORT).show();
return true;
}
});
popup.show();
}
});
}