C语言中的函数可以递归调用,即函数可以直接或间接调用自身
函数递归调用自身时,每次调用都会得到一个与以前的自动变量集合不同的新的自动变量集合
递归并不节省存储器的开销,因为递归调用过程中必须在某个地方维护一个存储处理值的栈
递归的执行速度并不快,但递归代码比较紧凑,并且比相应的非递归代码更易于编写和理解一个递归算法必须包括终止条件和递归部分
static
1 本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:
f(n)=f(n−2)+f(n−1) (n≥2),其中f(0)=0,f(1)=1。
int f( int n )
{
if (n==0)
return 0;
if (n==1)
return 1;
if(n>1)
return f(n-2) + f(n-1);
}
本题要求实现一个函数,将非负整数n转换为二进制后输出。
第二种方法:除基取余法
第一步,150除以2,商75,余0;
第二步,75除以2,商37,余1;
第三步,37除以2,商18,余1;
第四步,18除以2,商9,余0;
第五步,9除以2,商4,余1;
第六步,4除以2,商2,余0;
第七步,2除以2,商1,余0;
第8步,1除以2,商0,余1.
组合的时候,一定要记得最后得到的余数是二进制中的最高位。所以我们要倒着组合,得到10010110.
可能这种方法一开始不是那么好理解,可以对比我们熟悉的十进制数。如果我们有一个十进制数168,第一次除以10,商16,余8,这就相当于我们把个位的8(最低位)给“脱”下来了;第二次,16除以10,商1,余6,这就相当于把十位的那个6给“脱”下来了;然后再用1除以10,商0,余1,这就相当于把百位的1给“脱”下来了。所以我们这一路得到的余数,是从低位到高位的数字。那么二进制里,也是同样的道理。
使用这种方法,还是比较便捷的,只要计算的时候细心一些就好了。
不懂
#include <stdio.h>
void dectobin( int n );
int main()
{
int n;
scanf("%d", &n);
dectobin(n);
return 0;
}
/* 你的代码将被嵌在这里 */
void dectobin( int n )
{
if ( n / 2 > 0 )
dectobin( n / 2 );
printf("%d", n % 2);
}
3本题要求实现一个函数,对一个整数进行按位顺序输出。
#include <stdio.h>
void printdigits( int n );
int main()
{
int n;
scanf("%d", &n);
printdigits(n);
return 0;
}
/* 你的代码将被嵌在这里 */
void printdigits( int n )
{
if(n<10)
{
printf("%d\n",n);
}
else
{printdigits(n/10);
printf("%d\n",n%10);
}
}
5程序的功能是:求S=1/1!+1/2!+1/3!+…+1/N!并输出结果。N为任意自然数(只考虑int型),从键盘读入(不懂)
#include <stdio.h>
double fac();
int main(void)
{
int i, n;
double Sum = 0;
scanf("%d", &n);
for (i=1; i<=n; i++)
{
Sum += 1 / fac();
}
printf("S=1/1!+1/2!+...+1/%d!=%.15f", n, Sum);
return 0;
}
/* 请在这里填写答案 */
double fac()
{
static int a=1;
int i;
double d=1;
for(i=1;i<=a;i++)
{
d=d*i;
}
a++;
return d;
}