递归

1.求第n个斐波那契数

方法1:递归

#include "stdio.h"

int  fib(int m)

{

if (m <= 2)//1

{

return 1;

}

else //大于2时,例1,1,2,3

{

return fib(m - 1) + fib(m - 2);//fib(3)+fib(2)

    }

}

int main()

{

int n = 0;

int ret = 0;

printf("请输入n的值:\n");

scanf_s("%d", &n);

ret = fib(n);

printf("%d", ret);

    system("pause");

return 0;

}

方法2:非递归

#include "stdio.h"

int  main()

{

int i = 1;

int j = 1;

int sum = 0;

int k = 0;

int n = 0;

printf("请输入n的值:");

scanf_s("%d", &n);//1,1,2,3

for (k = 2; k<= n; k++)

{

sum = i + j;//1+1=2

i = j;

j = sum;

    }

printf("%d", sum);

system("pause");

return  0;

}

 

2.编写一个函数实现n^k,使用递归实现

#include "stdio.h"

int fac(int n,int k)

{

if (k ==0)

return 1;

else

{

return n*fac(n, k - 1);

}

}

 

 

int  main()

{

int n = 0;

int k = 0;

int ret = 0;

printf("请输入n值:\n");

scanf_s("%d\n", &n);

printf("请输入k值:\n");

scan_f("%d\n", &k);

ret = fac(n, k);

printf("%d", ret);

system("pause");

return 0;

}

 

 

3. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,

 

#include "stdio.h"

int Dignum(int k)

{

if (k <= 9)

return k;

else

   return Dignum(k / 10) + k % 10;//1719-->171+9-->17+1+9-->1+7+1+9

 

}

 

int  main()

{

int n = 0;

int ret = 0;

printf("请输入n值:\n");

scanf_s("%d\n", &n);

ret = Dignum(n);

printf("%d", ret);

system("pause");

return 0;

}

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

#include "stdio.h"

#include "assert.h"

void reverse_string(char *str,int len)//将abcdef->fedcba

{

assert(str);

char tmp= 0;

if (len > 0)

{

tmp = str[0];//将第一个字符先赋给tmp

str[0] = str[len];//将最后一个字符赋给第一个 --》fabcd

str[len] = '\0';//递归调用,限制条件len>0 ,每次调用的变化str++;

reverse_string(str +1,len);

str[len] = tmp;

}

}

int main()

{

char arr[] = "abcdef";

int sz = sizeof(arr)/sizeof(arr[0]);

printf("逆序之后为:\n");

reverse_string(arr,sz-1);

printf("%s\n", arr);

system("pause");

return 0;

}
5.递归和非递归分别实现strlen

方法一:递归

#include "stdio.h"

#include "assert.h"

int my_strlen(char*p)

{

assert(p);

if (*p == '\0')

{

return 0;

    }

else

{

return 1 + my_strlen(p+ 1);

}

 

}

int main()

{

char *str = "abcdef";

int ret = 0;

printf("字符串长度为:\n");

ret=my_strlen(str);

printf("%d\n",ret );

system("pause");

return 0;

}

 

方法二:非递归

int my_strlen(char*p)

{

assert(p);

   int count = 0;

    while (*p)

{

count++;

p++;

}

return count;

}


6.递归和非递归分别实现求n的阶乘

方法一:递归

#include "stdio.h"

#include "assert.h"

int fac(int n)

{

if (n == 1)

return 1;

else

return n*fac(n - 1);

}

    

int main()

{

int num = 0;

int ret = 0;

printf("输入n值:\n");

scanf_s("%d", &num);

ret = fac(num);

printf("%d\n", ret);

system("pause");

return 0;

}

 

方法二:非递归

int fac(int n)

{

int i = 0;

int tmp = 1;

for (i = 1; i <= n; i++)

{

tmp = i*tmp;

}

return tmp;

}
7.递归方式实现打印一个整数的每一位

#include "stdio.h"

#include "assert.h"

void print(int n)//假设数字为345  

{

if (n > 9)//符合条件,print(345)

{

print(n / 10);//递归调用print(34)保留输出9  第二次递归调用 print(3) 保留输出4  

}

    printf("%d ", n % 10);

}

    

int main()

{

int n= 0;

printf("请输入一个数;\n");

scanf_s("%d", &n);

print(n);

system("pause");

 

return 0;

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值