利用函数实现求第n个斐波那契数/实现n^k的计算/求取一个非负整数组成它的数字之和/将参数字符串的字符反向排列/实现strlen/n的阶乘/打印整数的每一位

1.递归和非递归分别实现求第n个斐波那契数。

采用函数递归来实现,缺点就是效率很低,每次都要从头开始调用
例如:
//50
//49 48
//48 47 47 46

#include<stdlib.h>
#include<stdio.h>
//1 1 2 3 5 8 13  21 34 55......
int fib(int n)//利用递归函数求取
{
	if (n <= 2)
		return 1;
	else
		return fib(n - 1) + fib(n - 2);
}
int main()
{
	int n = 0;
	int ret = 0;
	printf("求第n个斐波那契数:\n");
	scanf("%d", &n);
	ret=fib(n);
	printf("%d\n", ret);
	system("pause");
	return 0;
}

定义a,b,c,每次计算一位数,将a.b.c向后移动一位,避免重复计算

#include<stdlib.h>
#include<stdio.h>
//1 1 2 3 5 8 13 21 34 55
//a b c
int fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n > 2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}


2.写一个函数实现n^k的计算

#include<stdlib.h>
#include<stdio.h>
int Index(int n, int k)
{
	if (k == 1)
		return n;
	else
		return n*Index(n, k - 1);
}
int main()
{
	int n;
	int k;
	int ret;
	printf("请分别输入数字n和指数k\n");
	scanf_s("%d,%d", &n, &k);
	ret= Index(n, k);
	printf("ret=%d\n", ret);
	system("pause");
	return 0;
}
  1. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,
    例如,调用DigitSum(1729),则应该返回1 + 7 + 2 + 9,它的和是19
#include<stdlib.h>
#include<stdio.h>
void DigitSum(int n,int* sum)
{
	if (n > 9)
	{
		DigitSum(n / 10, sum);
	}
	*sum += n % 10;
}
//1729
//(172) 9
//(17) 2 9
//1 7 2 9
int main()
{
	int num;
	int sum=0;
	printf("请输入一个非负整数:\n");
	scanf("%d", &num);
	DigitSum(num, &sum);
	printf("%d", sum);
	system("pause");
	return 0;
}

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

void  reverse_string(char * string)
{
	if (*(string) != '\0')
	{
		reverse_string(string + 1);
	}
	printf("%c", *(string-1));
}
int main()
{
	char arr[] = "abcd";
	reverse_string(arr);
	printf("\n");
	system("pause");
	return 0;
}

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

#include<stdio.h>
#include<stdlib.h>
int Strlen(char* arr)//递归的方式实现
{
	if (*(arr) != '\0')
	{
		return Strlen(++arr)+1;
	}
	return 0;
}
int len(char* arr)//非递归的方式
{
	int count = 0;
	while (*(arr + count) != '\0')
	{
		count++;
	}
	return count;
}
int main()
{
	int ret;
	char arr[] = "abcd";
	ret=Strlen(arr);
	printf("%d\n", ret);
	ret = len(arr);
	printf("%d\n", ret);
	system("pause");
	return 0;
}

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

#include<stdio.h>
#include<stdlib.h>
int Fac(int i)//用递归函数实现n的阶乘
{
	if (i <= 1)
	{
		return 1;
	}
	return i*Fac(i - 1);
}
int fac(int i)//用非递归函数实现
{
	int n = 1;
	int ret = 1;
	for (n = 1; n <= i; ++n)
	{
		ret = ret*n;
	}
	return ret;
}
int main()
{
	int i;
	printf("请输入想要所求数字n的阶乘:\n");
	scanf("%d", &i);
	Fac(i);
	printf("%d\n", Fac(i));
	fac(i);
	printf("%d\n", fac(i));
	system("pause");
	return 0;
}

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

#include<stdio.h>
#include<stdlib.h>
int Print(int n)
{
	if (n > 9)
	{
		Print(n/10);
	}
	printf("%d ", n % 10);
}
int main()
{
	int i;
	printf("请输入一个整数:\n");
	scanf_s("%d", &i);
	Print(i);
	system("pause");
	return 0;
}



猜你喜欢

转载自blog.csdn.net/weixin_44936160/article/details/90263547