递归和循环

递归设计思路

数列递归 : 如果一个数列的项与项之间存在关联性,那么可以使用递归实现 ;
原理 : 如果一个函数可以求A(n),那么该函数就可以求A(n-1),就形成了递归调用 ;
注意: 一般起始项是不需要求解的,是已知条件

递归求解问题的过程 :


第一步 : 找出规律
第二步: 函数调用自己求解前面的项
第三步: 交代起始项,让递归能够停止

目录

递归设计思路

递归求解问题的过程 :

编程求解1+2+3+...+n

问题描述

小丽找数

问题描述

数字直角(1)

问题描述

请输出n~1之间所有的整数

问题描述

求100+97+……+4+1的值

问题描述

数字直角(2)

问题描述

求整数位数

题目描述


编程求解1+2+3+...+n

问题描述


编程求解下列式子的值:
S=1+2+3+⋯+n。
输入
输入一行,只有一个整数
n(1≤n≤1000) 。
输出
输出只有一行(这意味着末尾有一个回车符号),包括 1 个整数。
样例
输入复制
100
输出复制
5050

#include<iostream>
#include<iomanip>
using namespace std;
int func(int i,int n,int sum);
int main()
{
	int n;
	cin>>n;
	cout<<func(1,n,0);
	return 0;
}
int func(int i,int n,int sum) 
{
	if(i>n) return sum;
	return func(i+1,n,sum+i);
}

小丽找数

问题描述


小丽同学想在 1∼n 中找出这样的数,这个数的各个位的和不能被 2 整除也不能被 5 整除,比
如 3、12、25、30、1003、12、25、30、100 。这些数都满足各个位的和不能被 2 和 5 整除。
请你编程找出 1∼n 中这些数有多少个?
输入
一个整数n(n≤9999)。
输出
1∼n 中满足条件的数的个数。

#include<iostream>
#include<iomanip>
using namespace std;
int func(int i,int cnt);
int n;
int main()
{
	cin>>n;
	cout<<func(1,0);
	return 0;
}
int func(int i,int cnt) 
{
	if(i>n) return cnt;
	int sum = 0;
	int tmp = i;
	while(tmp!=0)
	{
		sum = sum + tmp%10;
		tmp = tmp/10;
	}
	if(sum%2!=2 && sum%5!=0)
	{
		return func(i+1,cnt+1);
	}
	else
	{
		return func(i+1,cnt);
	}
}

数字直角(1)

问题描述


请打印 n 行的数字直角三角形。
输入
一个整数 n<10。
输出
输出如下方图所示
n 行的数字直角三角形。
输入复制
3
输出复制
1
22
333

#include<iostream>
#include<iomanip>
using namespace std;
void func(int i);
int n;
int main()
{
	cin>>n;
	func(1);
	return 0;
}
void func(int k) 
{
	if(k>n) return; 
	for(int i = 0;i<k;i++)
	{
		cout<<k;
	}
	cout<<endl;
	func(k+1);
}

请输出n~1之间所有的整数

问题描述


从键盘读入一个整数n ,请输出n∼1 之间所有的整数,每行输出 1 个。比如,假设读入n=5 ,输出结果如下:
5
4
3
2
1
输入
一个整数n 。
输出
输出n∼1 之间所有的数,每行 1 个。
样例
输入复制
5
输出复制
5
4
3
2
1

#include<iostream>
#include<iomanip>
using namespace std;
void func(int i);
int n;
int main()
{
	cin>>n;
	func(n);
	return 0;
}
void func(int k) 
{
	if(k==0) return; 
	cout<<k<<endl;
	func(k-1);
}

求100+97+……+4+1的值

问题描述


求 100+97+⋯+4+1 的值。
输入
无。
输出
输出一行,即求到的和。

#include<iostream>
#include<iomanip>
using namespace std;
int func(int k,int sum);
int main()
{
	func(100,0);
	return 0;
}
int func(int k,int sum) 
{
	if(k>0) return sum; 
	func(k-3,sum+k);
	cout<<sum;
}

数字直角(2)

问题描述


请打印 n 行的数字直角三角形。
输入
一个整数 n<10。
输出
输出如下方图所示
n 行的数字直角三角形。
输入复制
3
输出复制
1
12
123

#include<iostream>
#include<iomanip>
using namespace std;
void func(int i);
int n;
int main()
{
	cin>>n;
	func(1);
	return 0;
}
void func(int k) 
{
	if(k>n) return; 
	for(int i = 0;i<k;i++)
	{
		for(int j = 1;j<i;j++)
		{
			cout<<j;
		}
	}
	cout<<endl;
	func(k+1);
}

求整数位数

题目描述


求任意正整数的位数。比如16是两位数,3696是四位数等
输入:一个整数
输出:这个整数的位数
输入案例:
45109
输出案例:
5

#include<iostream>
#include<iomanip>
using namespace std;
int func(int i,int x);
int n;
int main()
{
	cin>>n;
	cout<<func(1,0);
	return 0;
}
int func(int i,int x) 
{
	if(i>n) return x;
	int sum = 0;
	int tmp = i;
	while(tmp!=0)
	{
		x++;
		sum = sum + tmp%10;
		tmp = tmp/10;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李余雄霸天下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值