元小白(猿小白)进阶日记:十三(可恶的递归)

递归求n!

#include<stdio.h>
int Function(n)
{
	if (n == 1)
	{
		return 1;
	}
    return n*Function(n - 1);	
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Function(n);
	printf("(%d)!=%d\n",n, ret);
	return 0;
}

汉诺塔
/*
1 A==>C 1
2 A==>B A==>C B==>C 3
3 A==>C A==>B C==>B A==>C B==>A
B==>C A==>C 7
4

64 2^64-1
*/

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
void Move(char pos1, char pos2)
{
	printf("%c-->%c\n", pos1, pos2);
}
void Hanoi(int n, char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		Move(pos1, pos3);
	}
	else
	{
		Hanoi(n - 1, pos1, pos3, pos2);
		Move(pos1, pos3);
		Hanoi(n - 1, pos2, pos1, pos3);
	}
}
int main()
{
	Hanoi(12, 'A', 'B', 'C');
	return 0;
}

逆置输出字符数组

1、递归

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h> void reverse_string(char *p)
{
	int len = strlen(p);
	char tmp = *p;
	*p = *(p+len-1);
	*(p+len-1) = '\0';
	if(strlen(p+1) > 1)
	{
		reverse_string(p+1);
	}
	*(p+len-1) = tmp;
}
int main()
{
	char str[80];
	scanf("%s", str);
	printf("%s\n",str);
	reverse_string(str);
	printf("%s\n",str);
	return 0;
}

2、非递归

 #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    #include<string.h>
    void reverse_string(char *str)
    {
    	char *left = str;
    	char *right = str + strlen(str) - 1;
    	while (left < right)
    	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char str[80];
	scanf("%s", str);
	printf("%s\n", str);
	reverse_string(str);
	printf("%s\n", str);
	return 0;
}

不用库函数求字符串长度

1、非递归法

  #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    #include<string.h>
    #include<assert.h>
    int MyStrlen1(char *str)
    {
	
	int count = 0;
	assert(str != NULL);//断言  DEBUG 不是函数  是宏,断言str不为NULL,如果是NULL,程序就不会执行下去  
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char *str = "abcdef";
	int len = MyStrlen(str);
	printf("%d\n",len);
	return 0;
}

2、递归法

 #define _CRT_SECURE_NO_WARNINGS 1
 #include<stdio.h>
 #include<string.h>
int MyStrlen(char *str)
{
	if (*str == '\0')
	{
		return 0;
	}
	else
	{
		return 1 + MyStrlen(str + 1);
	}
}


int main()
    {
    	char *str = "abcdef";
    	int len = MyStrlen(str);
    	printf("%d\n",len);
    	return 0;
    }

递归打印整数的每一位

    #define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void Print(int n)
{
	if (n > 9)
	{
		Print(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	Print(n);
	return 0;
}

求一个数每一位数字之和
例如:1278----->1+2+7+8=18

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int DigitSum(int n)
{
	if (n < 10)
	{
		return n;
	}
	else//14   123
	{
		return DigitSum(n / 10) + n % 10;
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int res = DigitSum(n);
	printf("%d\n",res);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44748803/article/details/89208132