閱讀下列程序,寫出程序執行后的輸出結果。
1.
#include <iostream>
using namespace std;
int fun(int x)
{
int f;
if (x<=2) f=1;
else f= fun(x-1)+fun(x-2);
return f;
}
int main()
{
cout<<fun(8)<<endl;
return 0;
}
分析:int fun(int x)函數通過遞歸求斐波那契數列第x項的值。遞歸終止時:f(1)=f(2)=1,遞歸式子為:f(n)=f(n-1)+f(n-2)。
程序輸出結果為: 21
2.
#include <stdio.h>
int f(int n, int m)
{
if (m>n) return 0;
if (m==1) return n ;
return f(n-1,m-1) + f(n-1,m);
}
int main()
{
printf("%d\n",f(5,3));
return 0;
}
分析:int f(int n, int m)函數通過遞歸求從n個數中選出m個數的組合數。遞歸終止條件為:m>n(需要選出的數比待選數多,不可能選出,故返回0)或m=1(n個數中任選1個數有n種選擇,故返回n)。遞歸式為:
f(n,m) = f(n-1,m-1) + f(n-1,m) 當n>=m>1時。
從n個數中選擇出m個數可以看成兩種情況:(1)選擇第n個數,此時需要在前n-1個數中選擇m-1個數,即調用f(n-1,m-1);(2)不選擇第n個數,此時需要在前n-1個數中選擇m個數,即調用f(n-1,m)。
程序輸出結果為: 10
3.
#include <stdio.h>
int f(int a,int b)
{
if (a%b) return f(b,a%b);
else return b;
}
int main()
{
printf("%d\n",f(20,12));
return 0;
}
分析:int f(int a,int b)函數的功能是求整數a和b的最大公約數。
程序輸出結果為: 4
4.
#include <stdio.h>
int fun(int x)
{
if (x<10) return x;
else return x%10+fun(x/10);
}
int main()
{
printf("%d\n",fun(19491001));
return 0;
}
分析:int fun(int x) 函數的功能是求整數x的各位數字之和。遞歸終止條件為:x<10,即1位數的數字和是其本身;遞歸式含義為:若整數x的位數n>=2,則其各位數字和可以看成是其個位數字(x%10)加上其高n-1位數字組成的整數x/10的各位數字之和fun(x/10)。
程序輸出結果為:25
5.
#include <stdio.h>
int f(int k)
{
if (k<0)
return k*2;
else
return f(k-2)+k;
}
int main()
{
printf("%d\n",f(5));
return 0;
}
分析:為求f(5),要求f(3)+5;而f(3)=f(1)+3,f(1)=f(-1)+1,f(-1)=2*(-1)=-2,所以f(1)=-1,f(3)=2,f(5)=7。
程序輸出結果為:7
6.
#include <stdio.h>
int f(int n, int m)
{
int i, sum;
if (m == 1) return 1;
sum = 0;
for (i = 1; i <=n; i++)
sum += f(i, m - 1);
return sum;
}
int main()
{
printf("%d\n",f(5,3));
return 0;
}
分析:為求f(5,3),需求f(1,2)+f(2,2)+f(3,2)+f(4,2)+f(5,2),
f(1,2)=f(1,1)=1,
f(2,2)=f(1,1)+f(2,1)=1+1=2,
f(3,2)=f(1,1)+f(2,1)+f(3,1)=1+1+1=3,
f(4,2)=f(1,1)+f(2,1)+f(3,1)+f(4,1)=1+1+1+1=4
f(5,2)=f(1,1)+f(2,1)+f(3,1)+f(4,1)+f(5,1)=1+1+1+1+1=5。
程序輸出結果為: 15
擴展:若 將程序中的 “if (m == 1) return 1;”改寫為“if (m == 1) return n;”,則
f(5,3)=1+(1+2)+(1+2+3)+(1+2+3+4)+(1+2+3+4+5)=35.
7.
#include <stdio.h>
void prim(int m, int n)
{
if(m>n)
{
while(m%n != 0) n++;
m /= n;
prim(m, n);
printf("%d*",n);
}
}
int main()
{
prim(60,2);
return 0;
}
分析:void prim(int m, int n)函數的功能是將整數m從質因數n開始分解質因數。
程序輸出結果為:5*3*2*2*
8.
#include <stdio.h>
void fun(char s[], int n)
{
if (n<2)
return;
char t;
t=s[0]; s[0]=s[n-1]; s[n-1]=t;
fun(&s[1],n-2);
}
int main()
{
char s[]="ABCDEFG";
fun(s,7);
printf("%s\n",s);
return 0;
}
分析:void fun(char s[], int n)函數的功能是將具有n個元素的數組s逆序。遞歸終止條件為:n<2,當數組中元素個數不足2個時,直接返回;當元素個數超過2個時,將首尾元素交換,然后將中間n-2個元素逆序,即遞歸調用 fun(&s[1],n-2)。
程序輸出結果為:GFEDCBA