一道TCL的筆試題---遞迴
在下面這個程式片段中的劃線處填上適當的表示式,使之逆序輸出陣列元素。
--------------------------------------------------------------------------------
void recur(int a[], int k)
{
int tmp;
if(_____)
{
recur(_____, _____);
tmp = a[0];
a[0] = a[k-1];
a[k-1] = tmp;
}
}
--------------------------------------------------------------------------------
這道題目要用遞迴的思想完成陣列元素的逆序排列,我們先來複習一下有關遞迴函式一般解題思路。
一般而言,遞迴函式要有一個恰當的返回條件,以便到達那個條件的時候返回,不至於無窮巢狀進去,因此這個返回條件一定要在某個時候成立。另外,遞迴解決問題的思路就是:如果我要完成A任務,我必須先完成B任務,而要完成B任務,我又必須完成C任務……以此類推,就像經典的漢諾塔問題一樣,到最後只需要解決掉最簡單的那個任務即可,以此返回便能達到目的。如下圖:
回到這道題目來,如果給出一個陣列{1,2,3,4,5,6,7,8},又假設此時令k=6,即要讓前6個元素逆序,我們可以這麼分解問題:要讓1,2,3,4,5,6逆序,我可以先讓2,3,4,5逆序,只要它們逆序了,我只需交換1和6即可;而要解決這第二個問題,我可以先讓3,4逆序,只要它們逆序了,我只需交換2和5即可,最後我只需交換3和4即可。因此交換序列中的中間兩個元素成為我們用遞迴思想解決這道題的第一步。
首先我們來確定返回條件,這個好辦,只要k值大於等於2,我們才有交換的必要,否則根本不需要交換。這個應該沒啥異議的,if語句裡面填的應該就是k>1或者k>=2。
void invert_printf(int *a,int n) { if(n>1) { invert_printf(a+1,n-2); { int tem; tem=*a; *a=*(a+n-1); *(a+n-1)=tem; } } } void main() { int n,p[20]; while(scanf("%d",&n)&&n) { int i; for(i=0;i<n;i++) scanf("%d",p+i); invert_printf(p,n); for(i=0;i<n;i++) printf("%d ",*(p+i)); printf("\n"); } }
相關文章
- 一道遞迴陣列面試題遞迴陣列面試題
- 一道Postgresql遞迴樹題SQL遞迴
- 面安服的一道筆試題筆試
- 從一道筆試題題說起筆試
- 遞迴問題遞迴
- 揹包問題的遞迴與非遞迴演算法遞迴演算法
- 想了很久,一道Microsoft的筆試題目 —— Reversing Linked ListROS筆試
- 樹遞迴問題的求解遞迴
- 從一道春招筆試題說起 [上]筆試
- 每日一道java筆試題 2020-9-23Java筆試
- 做面試的不倒翁:一道事件迴圈題引發的血案面試事件
- 從一道沒人能答對的面試題聊聊Java的值傳遞面試題Java
- 你應該會的一道多執行緒筆試題執行緒筆試
- 一道面試題的分析面試題
- 第一章 遞迴問題 學習筆記遞迴筆記
- 遞迴-*全排列問題遞迴
- 遞迴路徑問題遞迴
- 一道面試題引起的思考面試題
- 分享一道昨天的面試題面試題
- 遞迴和尾遞迴遞迴
- 一道setTimeout async promise執行順序的筆試題引發的思考Promise筆試
- hdu2048遞迴問題遞迴
- hdu2049遞迴問題遞迴
- hdu2045 遞迴水題遞迴
- 什麼是遞迴?遞迴和迴圈的異同遞迴
- ios基礎之一天一道筆試題(1)iOS筆試
- 一道面試題引發的思考面試題
- 一道面試題引發的“血案”面試題
- 分享一道Go面試必考的題Go面試
- 快速排序【遞迴】【非遞迴】排序遞迴
- 【理解】一道 JS 面試題JS面試題
- 一道騷面試題目面試題
- 遞迴求解漢諾塔問題遞迴
- 遞迴解決全排列問題遞迴
- leetcode題解(遞迴和回溯法)LeetCode遞迴
- java常見遞迴練習題Java遞迴
- 聊聊一道簡單的javascript面試題JavaScript面試題
- 從 Google 的一道面試題說起·Go面試題
- 關於PHP字串的一道面試題PHP字串面試題