根據(jù)評論要求,改進代碼:
從網(wǎng)站建設到定制行業(yè)解決方案,為提供成都網(wǎng)站設計、做網(wǎng)站服務體系,各種行業(yè)企業(yè)客戶提供網(wǎng)站建設解決方案,助力業(yè)務快速發(fā)展。創(chuàng)新互聯(lián)將不斷加快創(chuàng)新步伐,提供優(yōu)質的建站服務。
1、函數(shù)getBCode是題目要的遞歸函數(shù),實現(xiàn)轉二進制(最高位是符號位)。
思路是十進制數(shù)絕對值除以2求余,得到反向二進制原碼,反向創(chuàng)建鏈表保存結果,最終得到的單向鏈表就是完整二進制數(shù)原碼,之后根據(jù)正負性,負數(shù)取反+1。鏈表頭添加符號位。
2、函數(shù)freeBny為釋放鏈表,如要重復調用函數(shù)getBCode,每次調用需調用一次freeBny。
3、函數(shù)showBny是打印輸出,為對齊顯示,按4的倍數(shù)位打印,高位補齊的位數(shù)值均與符號位一致。
#include stdio.h
#include malloc.h
#include math.h
typedef struct binary//成員用char類型保存數(shù)值,不是'1'或'0'的ASCII碼
{
char b;//一位二進制數(shù)0或1
struct binary *next;
}BNY;
BNY *getBCode(int n);//獲得二進制數(shù)(最高位是符號位)
void showBny(BNY *bnyHead);//對齊打印二進制數(shù)(保證是4的倍數(shù))
void freeBny(BNY *bnyHead);//釋放二進制數(shù)鏈表空間
int main()
{
int n;
BNY bny,*bnyHead=bny;
while(1)
{
? printf("請輸入一個整數(shù):"),scanf("%d",n);
? bnyHead-next=getBCode(n);
? printf("轉為二進制數(shù):"),showBny(bnyHead);
? freeBny(bnyHead);
? printf("\n");
}
return 0;
}
void freeBny(BNY *bnyHead)
{
BNY *prev=NULL,*bny=NULL;
bny=bnyHead-next;
while(bny)
{
? if(prev) prev-next=NULL,free(prev),prev=NULL;
? prev=bny;
? bny=bny-next;
}
bnyHead-next=NULL;
}
void showBny(BNY *bnyHead)
{
int i,f=-1,len=0,n=0;
BNY *bnySave=bnyHead;
while(bnyHead-next)
{
? if(f==-1) f=bnyHead-next-b;
? len++;
? bnyHead=bnyHead-next;
}
if(len%4)
? n=4-len%4;
for(i=0;in;i++)printf("%d",f);
bnyHead=bnySave;
while(bnyHead-next)
{
? printf("%d",bnyHead-next-b);
? n++;
? if(n==4)printf(" "),n=0;
? bnyHead=bnyHead-next;
}
}
BNY *getBCode(int n)
{
int s,y;
static BNY*bnyPrev=NULL;
static int cy=0,f=-1;//加1進位用
if(f==-1 n=0)f=1;
if(f==-1 n0)f=0,cy=1;
n=abs(n);
BNY *bnyNew=NULL;
s=n/2,y=n%2;
bnyNew=(BNY *)malloc(sizeof(BNY));
if(!bnyNew) return NULL;
bnyNew-b=y;
// 如是負數(shù),直接取反+1
if(!f) bnyNew-b=!(bnyNew-b);//從最低位開始,負數(shù)取反
if(cy)bnyNew-b=bnyNew-b+cy,cy=0;//負數(shù)+1
if(bnyNew-b1)bnyNew-b=0,cy=1;
bnyNew-next=NULL;
if(bnyPrev) bnyNew-next=bnyPrev;
bnyPrev=bnyNew;
n=s;
if(n==0)
{
? bnyNew=(BNY *)malloc(sizeof(BNY));//添加符號位
? if(!bnyNew) return NULL;
? if(!f)
? ? ? bnyNew-b=1;
? else
? ? ? bnyNew-b=0;
? bnyNew-next=bnyPrev;
? bnyPrev=NULL;
? cy=0,f=-1;
? return bnyNew;
}
return getBCode(n);
}
#include?stdio.h
int?gcd(int?m,int?n)?{
if(m*n==0)
return?(m==0?n:m);
if(mn)
return?gcd(m%n,n);
else?if(mn)
return?gcd(n%m,m);
}
int?main(void)?{
int?m,n;
printf("請輸入兩個數(shù):\n");
scanf("%d%d",m,n);
printf("其最大公約數(shù)為:\n");
printf("%d\n",gcd(m,n));
return?0;
}
運行結果
#?include?stdio.h
void?reverse(?int?n);?//函數(shù)聲明
void?main?(?)
{?? int?n;
printf("Input?n:?"); scanf("%d",n);
if(n0) n=-n;
printf("The?reversed?digits?are:?");
reverse(n);
printf("\n");
}
void?reverse(int?n)???//定義遞歸函數(shù)
{ printf("%d",?n%10);? //輸出最低位數(shù)
if(n/10!=0)???reverse(n/10);? //如果除去最低位后還有其他數(shù)字,遞歸處理剩余部分
}
這個題用循環(huán)語句比較簡單,遞歸的話稍微復雜點,下面是我剛寫的:
Hand和Hand2是遞歸函數(shù);Test是測試函數(shù),用來檢驗x1,x2,x3的值是否滿足條件,滿足的話輸出(這個函數(shù)不是重點,我只寫了句提示,你把它補充完整就行);fun函數(shù)直接調用Hand函數(shù),主函數(shù)中把fun函數(shù)放進去就行了。
void fun(bool x1,bool x2,bool x3){
static int count=0;
Hand(x1,x2,x3,count);
}
void Test(bool X,bool Y,bool Z){ //測試函數(shù)
if((x1 || !x2 || x3)(!x1 || x2 || x3)) ..... 輸出X,Y,Z的值
}
bool Hand2(int x){ //遞歸函數(shù),按順序為x1x2x3賦值
if(x=0) return false;
ruturn !Hand(x-1);}
void Hand(bool x1,bool x2,bool x3,count) //遞歸函數(shù),依次賦值并檢測(調用了Hand2和Test)
{
if (count=8) return ;
x1=Hand2(count%4);x2=Hand2(count%2);x3=Hand2(count);
Test(x1,x2,x3);
Hand(x1,x2,x3,count++);
}
采用就給分吧。
#include?"stdio.h"
void?intrev(int?n){
if(n){
printf("%d",n%10);
intrev(n/10);
}
}
int?main(int?argc,char?*argv[]){
int?x;
printf("Please?enter?a?positive?integer...\n");
if(scanf("%d",x)!=1?||?x1){
printf("Input?error,?exit...\n");
return?0;
}
intrev(x);
printf("\n");
return?0;
}
運行樣例:
我給你舉個簡單的例子你就明白了,你可以假設n=3
然后代入這個函數(shù),a(3)=a(2)+5;而a(2)=a(1)+5;a(1)=1
所以最后就是a(3)=1+5+5=11…
同理你可以算出a(10)=1+5*9=46
滿意請采納
分享標題:遞歸函數(shù)c語言教案 函數(shù)與遞歸c語言
URL鏈接:http://sd-ha.com/article10/hiesgo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供服務器托管、網(wǎng)站收錄、企業(yè)建站、App設計、品牌網(wǎng)站建設、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)