简单的递归习题

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;
    }

}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值