一些递归的应用以及其非递归写法

1.斐波那契数列

#include <stdio.h>

//递归
int Fibonacci(int n)
{
	if (n == 1 || n == 2)
	{
		return 1;
	}
	return Fibonacci(n - 1) + Fibonacci(n - 2);
}

//非递归
int Fibonacci(int n)
{
	int i = 0;
	int a = 1;
	int b = 1;
	int c = 0;

	if (n == 1 || n == 2)
	{
		return 1;
	}
	else
	{
		for (i = 2; i < n; i++)
		{
			c = a + b;
			b = a;
			a = c;
		}
		return c;
	}
}

int main()
{
	int n = 7;
	int ret = 0;

	ret = Fibonacci(n);

	printf("%d\n", ret);

	return 0;
}

2.求一个数的n次方

#include <stdio.h>

int Pow(int n, int k)
{
	if (0 == k)
	{
		return 1;
	}
	if (k > 0)
	{
		return n * Pow(n, k - 1);
	}
	return n;
}

int main()
{
	int n = 2;
	int k = 5;
	int ret = 0;

	ret = Pow(n, k);

	printf("%d\n", ret);

	return 0;
}

3.求一个数每一位数之和

#include <stdio.h>

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

int main()
{
	int n = 1729;
	int ret = 0;

	ret = DigitSum(n);

	printf("%d\n", ret);

	return 0;
}

4.strlen函数的递归和非递归写法

#include <stdio.h>

int My_strlen(const char *str)
{
	int i = 0;
	int count = 0;

	for (i = 0; *str; i++)
	{
		count++;
		str++;
	}
	return count;
}

int My_strlen(const char *str)
{
	if (*str != '\0')
	{
		return 1 + My_strlen(++str);
	}

	return 0;
}

int main()
{
	char str[] = "abcde";
	
	printf("%d\n", My_strlen(str));

	return 0;
}

5.将一个字符串逆置

#include <stdio.h>
#include <assert.h>

char *reverse_string(char *str)
{
	assert(str != NULL);

	int n = 0;
	char *p = str;
	char *q = p;
	char tmp = 0;

	while (*p != '\0')
	{
		p++;
		n++;
	}

	if (n > 1)
	{
		tmp = *q;
		*q = *(p - 1);
		*(p - 1) = '\0';
		reverse_string(q + 1);
		*(p - 1) = tmp;
	}

	return q;
}

int main()
{
	char str[] = "abcdef";

	printf("%s\n", str);

	printf("%s\n", reverse_string(str));

	return 0;
}

6.求一个数的阶乘

#include <stdio.h>

int Fac(int n)
{
	if (n > 1)
	{
		return n * Fac(n - 1);
	}

	return 1;
}

int Fac(int n)
{
	int i = 0;
	int ret = 1;

	for (i = 1; i <= n; i++)
	{
		ret *= i;
	}

	return ret;
}

int main()
{
	int n = 5;
	int ret = 0;

	ret = Fac(n);

	printf("%d\n", ret);
}

7.打印一个数的每一位

#include <stdio.h>

void Print(int n)
{
	if (n >= 10)
	{
		Print(n / 10);
	}
	printf("%d ", n % 10);
}

int main()
{
	int n = 1024;

	Print(n);

	printf("\n");

	return 0;
}

注意:递归写法虽然清晰简单,但多次调用函数,使用过多的内存空间,若递归层数比较深,应改写非递归算法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值