递归思路练习斐波那契数

1.递归和非递归分别实现求契第n个斐波那契数(代码,思路)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//递归实现
int dg(int n)
{
	if (n == 1 || n == 2)
		return 1;
	return dg(n - 1) + dg(n - 2);
}
//非递归
int fdg(int n)
{
    //while循环实现
	//if (n < 3)
	//{
	//	return 1;
	//}
	//int c = 0;
	//int a = 1;
	//int b = 1;
	//while (n>2)
	//{	
	//	c = a + b;
	//	a = b;
	//	b = c;
	//	n--;
	//}
	//return c;

    //for循环实现
	int c = 0;
	int a = 1;
	int b = 1;
	if (n > 2)
	{
		for (int i = 2; i < n; i++)
		{
			c = a + b;
			a = b;
			b = c;
		}
		return c;
	}
	return 1;
}
int main()
{	
    printf("%d\n", dg(6));
	printf("%d\n", fdg(6));
}

递归实现求契第n个斐波那契数思路:首先需要知道什么是斐波那契数,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……可以看出从第三项2开始每一项都是前两项之和利用这一规律就可以很容易用递归的方法求解

 以下为方法递归求解过程思路展示

 

非递归实现求契第n个斐波那契数思路: 由于从第三项开始前两项之和等于第三项,故只需定义前两项a=1,b=1,则第三项c=a+b,求第四项a=b,b=c,c=a+b,依次循环下去就可以求出任意一项数列的值

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

int dg2(int n, int k)
{
    if (n == 0)
    {
        return 0;
    }
    else if (k == 0)
    {
        return 1;
    }
    else if (k == 1)
    {
        return n;
    }
    return n * dg2(n, k - 1);
}
int main()
{	
	printf("%d\n", dg2(2,5));	
}

 求n的k次幂递归思路展示

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

int DigitSum(n)
{
	if (n % 10 == n)
	{
		return n;
	}
	return DigitSum(n / 10) + DigitSum(n % 10);
}

 思路展示

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

int my_strlen(char* str)
{
	int i = 0;
	while (*str)
	{
		i++;
		str++;
	}
	return i;
}
void reverse_string(char* string)
{
	char* star = string;//定义指针变量Star指向数组arr的首地址
	char* end = string+my_strlen(string)-1;//定义指针变量end指向arr最后一个元素的地址
	if (*string)
	{
		char tmp = *star;//定义一个变量tmp存储arr数组的首元素
		*star = *end;//把最后一个元素的值赋给指针star指向的地址
		*end = '\0';//end指向的内容赋值为'\0'
		reverse_string(++star);//++star跳过第一个元素指向下一个元素的地址
		*end = tmp;//把end指向得内容再赋值为原来首元素(也就是原来star指向的元素)
	}	
}
int main()
{	
	char arr[] = "abcd";
	reverse_string(arr);
}

思路:由于不能使用C函数库中的字符串操作函数,但可以自己写个字符计算字符串长度的函数,进行字符串逆序需要知道当前字符串的长度my_strlen,从而得到最后一个元素的位置接着通过指针的方式把首尾位置的元素交换(注意事先要把首地址元素用定义的tmp保存,用于最后的*end = tmp;把开始*end = '\0';改回来)

 

 以下题目大体与上面类似不再赘述

 5.递归实现strlen

int dg_strlen(char* str)
{
	if (*str == '\0')
		return 0;
	return dg_strlen(++str)+1;
}
int main()
{	
    int arr[]="abcd";//字符串a b c d  \0:\0字符串的终止符号(不包含在字符串长度内)
	printf("%d",dg_strlen(arr));
}

 6.递归实现求n的阶乘

int dg_jc(int n)
{
	if (n == 1)
		return 1;
	else if (n == 0)
		return 0;
	return dg_jc(n - 1) * n;
}

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

void dg_print(int n)
{
	if (n > 9)
		dg_print(n / 10);
	printf("%d\n",n%10);
	
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值