C语言模拟练习(11)----递归

程序代码:

#include<stdio.h>
//1.递归实现求第n个feibonaq数
int fib(int n){
if(n>0){
if(n==1 ||n==2){
return 1;
}
return fib(n-1)+fib(n-2);
}
}
//2.非递归实现求第n个feibonaq数
int fib1(int n){
int arr[n];
arr[0]=arr[1]=1;
int i =2;
for(;i<n;++i){
arr[i] = arr[i-1] +arr[i-2];
}
return arr[n-1];
}


void TextFib(){
printf("\n**************%s***************\n",__FUNCTION__);
int ret = fib1(5);
int ret1 = fib1(5);
printf("except: 5,  actual:%d\n",ret1);
printf("except: 5,  actual:%d\n",ret);
return;
}


//3.编写一个函数实现n^k,使用递归实现
int achieve(int value,int n){
if(n == 0){
return 1;
}
if(n == 1){
return value;
}
return value*achieve(value,n-1);
}


void TextAchieve(){
printf("\n**************%s***************\n",__FUNCTION__);
int ret = achieve(2,5);
printf("ret = %d\n",ret);
}


//4.写一个递归函数DigitSum(n),输入一个
//非负整数,返回组成的数字之和,例如,
//调用DigitSum(1729),则应该返回1+7+2+9,
//它的和是19

int DigitSum(int value){
if(value<10){
return value;
}
return value%10+DigitSum(value/10);
}


void TextDigitSum(){
printf("\n**************%s***************\n",__FUNCTION__);
int value = 1927;
printf("value = %d\n",value);
int ret = DigitSum(value);
printf("ret = %d\n",ret);
return;
}


//5.编写一个函数reverse_string(char* string)
//(递归实现)
//实现:将参数字符串中的字符反向排列。
//要求:不能使用c函数库中的字符串操作函数

void reverse_string(char* string){
int i=0;
char* cur = string;
while(*string++ !='\0'){
++i;
}
int arr[i];
int j=0;
for(;j<i;j++){
arr[j] = cur[j];
}
int k = i;
i--;
for(j=0;j<i;i--,j++){
char tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
for(j=0;j<k;j++){
printf("%c ",arr[j]);
}
}


void TextReverse_string(){
printf("\n**************%s***************\n",__FUNCTION__);
char* string = "abcdefg";
printf("string: %s\n",string);
reverse_string(string);
printf("\n");
return;
}
//6.递归和非递归实现strlen
//递归实现

int my_strlen(char* str){
if(*str=='\0'){
return 0;
}
str++;
return 1+my_strlen(str);
}


int my_strlen1(char* str){
int i=0;
while(*str++ != '\0'){
i++;
}
return i;
}


void Textmy_strlen(){
printf("\n**************%s***************\n",__FUNCTION__);
char* str = "abcde";
printf("str = %s\n",str);
int ret = my_strlen(str);
int ret1 = my_strlen1(str);
printf("ret:   except:5   actual:%d\n",ret);
printf("ret1:  except:5   actual:%d\n",ret1);
return;
}

//7.递归和非递归实现求n的阶乘
//递归实现

int Factorial(int n){
if(n==0||n==1){
return 1;
}
return n*Factorial(n-1);
}
//非递归实现
int Factorial1(int n){
int ret = 1;
while(n){
ret = ret*n;
n--;
}
return ret;
}


void TextFactorial(){
printf("\n**************%s***************\n",__FUNCTION__);
int n = 5;
int ret = Factorial(n);
int ret1 = Factorial1(n);
printf("ret:  except:120,  actual:%d\n",ret);
printf("ret1:  except:120,  actual:%d\n",ret1);
return;

}


//8.递归方式实现打印一个整数的每一位
void print(int value){
if(value<10){
printf("%d\n",value);
return;
}
printf("%d ",value%10);
print(value/10);
}


void TextPrint(){
printf("\n**************%s***************\n",__FUNCTION__);
int value = 100;
print(value);
return;
}

//主函数
int main(){
TextPrint();
TextFib();
TextAchieve();
TextDigitSum();
TextReverse_string();
Textmy_strlen();
TextFactorial();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值