第3题
定义了全局变量 x 和 y, 在 num 函数中 使用了 extern x,y 就是外部定义的全局变量 x, y。extern 表示外部的。
打印之前调用了 num, num 中
x = a -b = 15 - 10 = 5
y = a + b = 25
所以打印为 5 , 25
第4题
调用 fun(132645)
-->fun(132645/100) * 10 + 132645%10 = fun(1326) * 10 + 5
-- --> fun(1326) 里 fun(1326/100) * 10 + 1326 % 10 = fun(13) * 10 + 6
-- -- --> fun(13) 里 13 < 100 所以 return 13 % 10 = 3
所以
fun(132645) 就可以写成 fun(1326) * 10 + 5 = (fun(13) * 10 + 6) * 10 + 5
= (3 * 10 + 6) * 10 + 5 = 36 * 10 + 5 = 360 + 5 = 365
修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。常用于全局变量或全局函数声明。
num函数里面用的xy就是main函数里面的xy
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
假设原数组是按照升序进行排序,那么需要将输入的值进行挨个比较,从第一个数开始,若小于输入的数,则和下一个数比较,直到大于输入的数,则将输入的值放在该位置,从大于他的数起往后移一位。
#include<stdio.h>
int main()
{
int a[10]={1,3,5,7,9,11,13,15,17,19};
int i,j,p;
printf("原数组为:\n");
for(i=0;i<10;i++)
printf("%3d",a[i]);
printf("\n输入要插入的数:\n");
scanf("%d",&p);
for(i=9;i>=0;i--)//比较选择放置的位置
{
j=i+1;
if(p>a[i])
{
a[j]=p;
break;}
else
a[j]=a[i];
}
printf("输出插入之后的序列:\n");
for(i=0;i<=10;i++)
printf("%d ",a[i]);
}
该程序包含两个部分:
1.斐波那契数列的计算:
该部分程序采用两种方法实现斐波那契数列的计算,一种为非递归算法,一种为递归算法。
斐波那契数列定义:
斐波那契数列定义如下:
$$f(1) = f(2) =1 , n>=3,f(n)=f(n-1)+f(n-2) $$
斐波那契序列的前几个数为:
1、1、2、3、5、8、13、21、34、55……
其中,非递归算法如下:
int Fibonacci_1(size_t n)//注意返回值可能会很大,但c语言中最大整数为4294967295
{ //测试后只能计算前46个斐波那契额数列
int first,second,third;//非递归算法
int i;
first=0;
second=1;
if(n<=2)
{
return 1;
}
for(i=2; i<=n; i++)
{
third=first+second;
first=second;
second=third;
}
return third;
}
而递归算法如下:
int Fibonacci_2(size_t n)//递归算法
{
if(n<=2)
{
return 1;
}
else
return Fibonacci_1(n-1)+Fibonacci_1(n-2);
}
其中,非递归算法的时间复杂度为$O(n^2)$,而递归算法的时间复杂度为$O(2^n)$,所以非递归算法的效率更高。
2.创建无头结点的单链表并输出
该部分程序实现的是创建无头结点的单链表,实现了链表节点的添加,并最终输出链表的值以及链表的长度。
其中,创建无头结点的单链表的函数代码如下:
struct node* create()
{
int n;
struct node* p, * head, * end;
head = end = NULL;
do {
scanf("%d", &n);
if (n != -1)
{
p = (struct node*)malloc(sizeof(struct node*));
p->data = n;
p->next = NULL;
if (end == NULL)
{
end = p;
}
else
{
p->next = head;//添加新节点
}
head = p;
}
} while (n != -1);
return head;
}
其中,scanf()函数是用来输入整数的,而当输入整数为-1时代表结束。
最后,整个程序的主函数的代码如下:
int main()
{
size_t n = 40;
printf("非递归算法第%d个斐波那契数为>:%d\n", n, Fibonacci_1(n));
printf("递归算法第%d个斐波那契数为>:%d\n", n, Fibonacci_2(n));
struct node* S;
S = create();
out(S);
printf("\n%d", len(S));
return 0;
}
其中,对于斐波那契数列的计算使用了非递归算法计算出了第40个斐波那契数,并将结果输出;而对于创建链表则使用了程序中的create()函数来创建无头结点的单链表,并最终输出链表的值以及链表的长度。