您好,登錄后才能下訂單哦!
前言
學習C語言的過程中,總會遇到很多令人眼前一亮的代碼,尤其是你寫了幾十行的代碼,別人只用了簡單幾行的遞歸就實現的功能。下面我就總結幾個C語言中 比較新手向的代碼。讓你有一種”woc!還能這么寫!”的想法,二進制 遞歸大神繞路。
第一種:遞歸類
求最大公因數
常規寫法:
int gcd(int m, int n) { int r; if (m>n){r=m,m=n,n=r;} r=n%m; while (r!=0){ n=m; m=r; r=n%m; } return m; }
騷操作!–遞歸寫法!
int gcd(int x, int y) { return y?gcd(y,x%y):x; }
第一次看到這個代碼,我的反應是黑人問號臉。臥槽?輾轉相除法,還能這么寫?wtf
逆序輸出字符串
常規寫法:
char *reverse(char *str) { if( !str ) //判斷輸入字符串是否為空串 { return NULL; //若為空串則返回NULL } int len = strlen(str); if( len > 1 ) { char ctemp =str[0]; str[0] = str[len-1]; str[len-1] = '\0'; // 最后一個字符在下次遞歸時不再處理 reverse(str+1); // 遞歸調用 str[len-1] = ctemp; } return str; }
遞歸寫法!
void reverse(char *x) { if(*x){ //若該字符型變量為0(ascii碼值為0,不是數字'0')的字符則不進入 fun(x+1); //遞歸調用 printf("%c",*x); //輸出單個字符 } }
這樣寫是不是有點棧的味道!
第二種:二進制!
交換兩個變量的值
常規寫法:
int temp = a; a = b; b = temp;
三行代碼,用到一個中間值。那么用二進制中的異或可以不使用第三個值,并且只有一行代碼。
使用二進制的寫法:
a ^= b ^= a ^= b;
具體兩者的時間復雜度,沒有深入的了解。
統計變量二進制中 ‘1' 的個數
常規寫法:
int v; //被計算的變量 int count=0; //計算二進制中‘1'的個數 while(v != 0){ if(v%2 ==1) count++; v /= 2; }
將被統計的變量對2求余,如果余數為1則count加一。
使用二進制的寫法:
int v=9; //被統計的變量 int count; //統計二進制中‘1'的個數 for(count=0; v; count++) { v &= v-1; }
利用二進制操作符的特性,操作二進制能讓方法變得更加簡單合理。
To be continue…
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。