1.递归和非递归分别实现求第n个斐波那契数。
代码如下:
<递归法:>
int fib(int num)
{
if (num <= 2)
{
return 1;
}
while (num > 2)
{
return fib(num - 1) + fib(num - 2);
}
}
<非递归:>
int fib(int num)
{
int n1 = 1;
int n2 = 1;
int sum = 1;
while (num > 2)
{
sum = n1 + n2;
n1 = n2;
n2 = sum;
num--;
}
return sum;
}
2.编写一个函数实现n^k,使用递归实现
代码如下:
int _power(int n, unsigned int k)
{
if(k == 0)
return 1;
if(k == 1)
return n;
return _power(n, k>>1)*_power(n, k>>1);
}
int power(int n, unsigned int k) // 求n 的 k 次方
{
// 判断结果是否为负数
int IsPositive = 1;
if(n < 0 && k&1 == 1)
IsPositive = -1;
int ret = _power(n, k);
if(k&1 == 1)
ret *= n;
return IsPositive*ret;
}
3.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
代码如下:
int digit_sum(int n) //求数字之和
{
if (n < 10)
{
return n;
}
else
{
return n % 10 + digit_sum(n / 10);
}
}
4.编写一个函数reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中 的字符串操作函数。
代码如下:
int my_strlen(const char *str)
{
assert(str);
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
void reverse_string(char * str, int len)
{
assert(str);
char *dest = str;
if (1 == len)
return ;
int i = 0;
char tem = str[0];
for (i = 0; i < len - 1; i++)
{
str[i] = str[i + 1];
}
str[i] = tem;
reverse_string(dest, len - 1);
}
5.递归和非递归分别实现strlen
代码如下:
int my_strlen(const char *str) //非递归
{
assert(str);
int count = 0;
while (*str++ != '\0')
{
count++;
}
return count;
}
int my_strlen(const char *str) //递归
{
assert(str);
if ('\0' == *str)
return 0;
else
return (1 + my_strlen(++str));
}
6.递归和非递归分别实现求n的阶乘
代码如下:
int factorial(int n) //非递归
{
int ret = n;
for (; n > 1; n--)
{
ret *= (n - 1);
}
return ret;
}
int factorial(int n) //递归
{
if (1 == n)
return n;
else
{
return n*factorial(n - 1);
}
}
7.递归方式实现打印一个整数的每一位
代码如下:
void print(int n)
{
if (n < 10)
printf("%d", n);
else
{
print(n / 10);
printf("%d", n % 10);
}
}
7. 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水。编程实现。
代码如下:
<迭代法>
int count_drink(int money)
{
int total = money;ds
int empty = money;
while (empty > 1)
{
total += empty / 2;
empty = empty / 2 + empty % 2;
}
return total;
}
<递归法>
int drink_count(int number)
{
if (number > 0) //空瓶子数量>1
{
while (number > 1)
{
if (1 == (number & 1)) //空瓶子数量是奇数
{
return number - 1 + drink_count((number / 2) + 1);
}
else //空瓶子数量是偶数
{
return number + drink_count(number / 2);
}
}
return 1;
}
else
{
return 0;
}
}