题目:编写一个函数求n的阶乘。
#include<iostream>
int Function(int n);
int main()
{
int n;
std::cin>>n;
int result=Function(n);
std::cout<<result;
}
int Function(int n)
{
if(n==0)
{
return 1;
}
else
return n*Function(n-1);
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题目: 一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
思路:在纸上写出经过后几个村子时卖出的鸭子数,就可看出规律。
#include<iostream>
int duck(int num);
int main()
{
int i=1;
int count=0;
for(i=1;i<=8;i++)
{
count=count+duck(i);
std::cout<<"经过第"<<i<<"个村子时,卖出"<<duck(i)<<"只鸭子"<<"\n";
}
std::cout<<"总共卖出了"<<count<<"只鸭子"<<std::endl;
return 0;
}
int duck(int num)
{
if(num==8)
return 2;
return 2*duck(num+1);
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题目:题目:角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
#include<iostream>
int Number(int result)
{
int count=0;
while(result!=1)
{
if(result%2==0)
{
result=result/2;
count++;
std::cout<<"第"<<count<<"次的结果为:"<<result<<"\n";
}
else
{
result=result*3+1;
count++;
std::cout<<"第"<<count<<"次的结果为:"<<result<<"\n";
}
}
}
int main()
{
int result;
Number(22);
return 0;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题目:日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?
解析:
对于第一个孩子a[0]来说,是先给出,再得到;而其他的孩子都是先得到,再给出。
第二个孩子a[1]:(a[1]+left[1])*6/7=ave,所以a[1]=ave*7/6-left[1],而left[2]=(a[1]+left[1])/7=ave*7/6/7=ave/6;
第三个孩子a[2]:(a[2]+left[2])*5/6=ave,所以a[2]=ave*6/5-left[2],而left[3]=(a[2]+left[2])/6=ave*6/5/6=ave/5;
......
第一个孩子的left[0]=ave/2,所以a[0]*7/8+ave/2=ave,从而求出a[0];其他的5个则是有规律的(上方),求出即可。
#include<iostream>
int main()
{
int a[6];//存放最开始桔子的数目
int ave=420;//平均数
int i;
int left;//传给下一个孩子的桔子数
for(i=0;i<6;i++)
{
if(i==0)
{
a[0]=(ave-ave/2)*(8-i)/(8-i-1);
left=a[0]/8;
}
else
{
a[i]=ave*(8-i)/(8-i-1)-left;
left=ave/(8-i-1);
}
}
for(i=0;i<6;i++)
{
std::cout<<a[i]<<"\t";
}
return 0;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题目:编写一个函数,可以分别打印一个整数十进制的每一位。
f(345)=f(34)+printf(5)=f(3)+printf(4)+printf(5)=printf(3)+printf(4)+printf(5)
#include<iostream>
void Function(int n)
{
if (n > 9)
{
Function(n / 10);
}
printf("%d\n", n % 10);
}
int main()
{
int n;
std::cin>>n;
Function(n);
return 0;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题目:编写一个函数实现n^k,使用递归实现。
#include<iostream>
int Function(int n,int k)
{
if(k==0)
return 1;
if(k==1)
return n;
else
return n*Function(n,k-1);
}
int main()
{
int n,k;
std::cin>>n;
std::cin>>k;
std::cout<<Function(n,k);
return 0;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题目:不允许创建临时变量求字符串长度,实现strlen的模拟。
#include<iostream>
int Function(char *p)
{
if(*p==NULL)
{
return 0;
}
else
{
return 1+Function(p+1);
}
}
int main()
{
char *p="abc";
std::cout<<Function(p);
return 0;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题目:编写一个函数reverse_string(char * string)(递归实现)。
重要知识点:在函数中,如果碰到return 语句,那么程序就会返回调用该函数的下一条语句执行,也就是说跳出函数的执行,回到原来的地方继续执行下去。
#include<iostream>
void Function(char *p)
{
if(*(p+1)==NULL)
{
std::cout<<*p;
// std::cout<<"程序结束?";
return ;
}
//std::cout<<1;
Function(p+1);
//std::cout<<2;
std::cout<<*p;
}
int main()
{
char *p="abc";
Function(p);
return 0;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题目:写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和。
解法1:
#include<iostream>
int sum=0;
int Function(int n)
{
if(n>=10)
{
Function(n/10);//不断的除以10,得到个位,然后加到sum上
}
sum=sum+n%10;
return sum;
}
int main()
{
int n;
std::cin>>n;
std::cout<<Function(n);
return 0;
}
解法2:
#include<iostream>
int Function(int n)
{
if(n<10)
{
return n;
}
else
{
return(n%10+Function(n/10));//以两位数为基本算法,从而推出多位数
//多加的位数是在后边加的,从而%10加上原来的即可。
}
}
int main()
{
int n;
std::cin>>n;
std::cout<<Function(n);
return 0;
}