第一次單元章節考覈
要求:
(1)要求動態通過鍵盤在對話框或命令行輸入,而後顯示結果(輸入輸出用scanner或system.in),本次考試的輸入不要採用JOptionPane的輸入方式;
(2)程序檢查過後點“提交”按鈕,然後關機,走人!
注意:
(1)嚴格按照輸入、輸出的要求,否則一律0分,補考!!!
題目如下:
1. Ackerman函數的遞歸實現算法。
輸入:輸入兩個數字,先輸入n,後輸入m。
輸出:Ackerman函數計算後的值。
示例:輸入:4 2,輸出:16
Ackerman函數A(n,m)定義如下:
有兩個獨立的整型變量m、n:
C++
#include<iostream>
using namespace std;
int Ackerman(int n,int m)
{
if (m==0&&n==1)
{
return 2;
}
if (m>=0&&n==0)
{
return 1;
}
if (m==0&&n>=2)
{
return n + 2;
}
if (m >=1 && n >= 1)
{
return Ackerman(Ackerman(n - 1,m), m - 1);
}
return 0;
}
int main()
{
int n, m;
cin >> n >> m;
int c=Ackerman(n,m);
cout << c;
return 0;
}
2.全排列的遞歸實現算法。
輸入:先輸入要求輸入的字符的個數,後依次輸入(或隨機生成)每個字符(不能僅僅是數字)。
輸出:全排列的結果。
示例:輸入:3 / * 2,輸出:/ * 2 / 2 * * / 2 * 2 / 2 * / 2 / *
C++
#include <iostream>
using namespace std;
int total = 0;
//交換函數
inline void swapArray(char &a, char &b) //設置成內聯函數運行更快
{
int temp;
temp = a;
a = b;
b = temp;
}
//遞歸函數
void fullPermutation(char fullArray [], int start, int end)
{
//這裏,既可以是">=",也可以是">",也可以是"=="
if (start ==end)
{
for (int i = 0; i<=end; i++){
cout << fullArray[i];
}
cout << endl;
}
else
{
for (int i = start; i <= end; i++)
{
swapArray(fullArray[start], fullArray[i]);//交換
fullPermutation(fullArray, start + 1, end);
swapArray(fullArray[start], fullArray[i]);//注意恢復原樣
}
}
}
int main()
{
int n;
cin >> n;
char *arr = new char[n];
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
fullPermutation(arr, 0, n - 1);
delete[]arr;
return 0;
}R的全排列可歸納遞歸定義如下:
3.整數劃分的遞歸實現算法。
輸入:輸入整數劃分的整數(只輸入一次,即n==m)。
輸出:輸入整數的劃分個數值。
示例:輸入:7,輸出:15
q(n,m)的如下遞歸關係定義如下:
正整數n的劃分數p(n)=q(n,n)。
C++
#include <iostream>
using namespace std;
int q(int n,int m)
{
if (n==1||m==1)
{
return 1;
}
if (n<m)
{
return q(n,n);
}
if (n==m)
{
return 1 + q(n,n-1);
}
if (n>m&&n>1&&m>1)
{
return q(n, m - 1) + q(n-m,m);
}
}
int main()
{
int n;
cin >> n;
int m = n;
int c = q(n, m);
cout << c;
return 0;
}
4.二分搜索的遞歸實現算法。
輸入:先輸入進行二分搜索元素的個數,然後按大小依次輸入(或隨機生成,然後排序)每個數字,最後輸入要求搜索的元素。
輸出:要求搜索元素的下標(下標從0開始!)。
示例:輸入:6 1 5 5 6 9 9 6,輸出3
C++
#include <iostream>
using namespace std;
//遞歸
int search(int arr[],int l,int r,int key)
{
int min = (l + r) / 2;
if (key==arr[min])
{
return min;
}
else if (key<arr[min])
{
return search(arr,l,min-1,key);
}
else if (key>arr[min])
{
return search(arr, min + 1, r, key);
}
else
{
return -1;
}
}
//非遞歸
/*int search(int arr[], int l, int r, int key)
{
while (l<=r)
{
int min = (l + r) / 2;
if (key == arr[min])
{
return min;
}
else if (key<arr[min])
{
r = min - 1;
}
else if (key>arr[min])
{
l = min + 1;
}
else
{
return -1;
}
}
}*/
int main()
{
int n;//個數
cin >> n;
int *arr = new int[n];//大小爲n的數組
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
int key;//要搜索的元素
cin >> key;
cout<<search(arr,0,n-1,key);
delete[] arr;
return 0;
}
第二次單元章節考覈
要求:
(1)要求動態通過鍵盤在對話框或命令行輸入,而後顯示結果(輸入輸出用scanner或system.in),本次考試的輸入不要採用JOptionPane的輸入方式;
(2)程序檢查過後點“提交”按鈕,然後關機,走人!
注意:
(1)嚴格按照輸入、輸出的要求,否則一律0分,補考!!!
題目如下:
1.寫出菲波拉契數列自底向上的非遞歸動態規劃算法或自頂向下的遞歸動態規劃算法(備忘錄方法)。
輸入:輸入一個數字。
輸出:輸出爲Fibonacci數列的值。
示例:輸入:5 ,輸出:8
Fibonacci數列可以遞歸地定義爲:
JAVA:
public static int Fibonacci(int n)
{
if (n==0||n==1) {
return 1;
}
if (n>1) {
return Fibonacci(n-1)+Fibonacci(n-2);
}
return -1;
}
public static void main(String[] args)
{
int n;
helloworld h=new helloworld();
Scanner s=new Scanner(System.in);
n=s.nextInt();
System.out.println(h.Fibonacci(n));
}
C++:
#include<iostream>
using namespace std;
int Fibonacci(int n)//遞歸
{
if (n==0||n==1)
{
return 1;
}
if (n>1)
{
return Fibonacci(n - 1) + Fibonacci(n-2);
}
return -1;
}
int sum = 0;
int Fibonacci1(int n)//非遞歸
{
int one = 1;
int two = 1;
int sum = 0;
for (int i = 1; i < n; i++)
{
sum = one + two;
two = one;
one = sum;
}
return sum;
}
int main()
{
int n;
cin >> n;
cout << Fibonacci1(n);
return 0;
}
2.合併排序的遞歸實現算法。
輸入:先輸入進行合併排序元素的個數,然後依次隨機輸入(或隨機生成)每個數字。
輸出:元素排序後的結果,數字之間不加任何標識符。
示例:輸入:8 11 1 2 4 8 6 15 8,輸出:1 2 4 6 8 8 11 15
#include<iostream>
using namespace std;
//合併排序/歸併排序
template<typename T>
void __mergeSort(T arr[], int l, int mid, int r)
{
// 經測試,傳遞aux數組的性能效果並不好
//T aux[r - l + 1];
T *aux = new T[r - l + 1];
for (int i = l; i <= r; i++)
aux[i - l] = arr[i];//賦值
int i = l, j = mid + 1;
for (int k = l; k <= r; k++){
if (i > mid)
{
arr[k] = aux[j - l]; j++;
}
else if (j > r)
{
arr[k] = aux[i - l]; i++;
}
else if (aux[i - l] < aux[j - l])
{
arr[k] = aux[i - l]; i++;
}
else
{
arr[k] = aux[j - l]; j++;
}
}
delete[]aux;
}
template<typename T>
void MergeSort(T arr[], int l, int r)
{
if (l >= r)
{
return;
}
int mid = (r + l) / 2;
MergeSort(arr, l, mid);//先將這個運行到底 ①
MergeSort(arr, mid + 1, r);//這個,mid不是那個例如數組大小爲6,mid=3那個mid,而是上步①結束時的mid
__mergeSort(arr, l, mid, r);//這個排序,排的是第一對(1邊1個),在排第二對。。。然後下一輪第一對(1邊2個)相排.。。
}
int main()
{
int n;
cin >> n;
int *arr = new int[n];
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
MergeSort(arr, 0, n-1);
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
delete[]arr;
return 0;
}
3.快速排序的遞歸實現算法。
輸入:先輸入進行合併排序元素的個數,然後依次隨機輸入(或隨機生成)每個數字。
輸出:元素排序後的結果。
示例:輸入:8 9 1 2 4 8 6 15 8,輸出:1 2 4 6 8 8 9 15
C++
/*#include<iostream>
using namespace std;
void QuickSort(int arr[],int l,int r)
{
if (l>=r)
{
return;
}
int i = l;
int j = r;
int v = arr[i];
while (i<j)
{
while (i<j&&arr[j]>=v)
{
j--;
}
arr[i] = arr[j];
while (i< j&&arr[i]<=v)
{
i++;
}
arr[j] = arr[i];
}
arr[i] = v;
QuickSort(arr,l,i-1);//縮小範圍,快排左邊的
QuickSort(arr,i+1,r); //快排右邊的
}
int main()
{
int n;
cin >> n;
int *arr = new int[n];
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
QuickSort(arr,0,n-1);
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
return 0;
}*/
JAVA答案
import java.util.Scanner;
public class Main {
//------------------------------Ackerman函數-------------------------------------
/*public static int Ackerman(int n,int m)
{
if (m==0&&n==1) {
return 2;
}
if (m>=0&&n==0) {
return 1;
}
if (m==0&&n>=2) {
return n+2;
}
if (m>=1&&n>=1) {
return Ackerman(Ackerman(n-1, m), m-1);
}
return -1;
}
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int a,b;
a=s.nextInt();
b=s.nextInt();
suanfa1 h=new suanfa1();
int c=h.Ackerman(a, b);
System.out.println(c);
}*/
//-------------------------------全排列---------------------------------
/*public static void SwapArr(char arr[],int a,int b) {
char temp;
temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
public static void AllSort(char[]arr,int start,int end) {
if (start==end) {
for (int i = 0; i <= end; i++) {
System.out.print(arr[i]);
}
System.out.println();
}else {
for (int i = start; i <=end; i++) {
SwapArr(arr, start, i);
AllSort(arr, start+1, end);
SwapArr(arr, start, i);
}
}
}
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
suanfa1 h=new suanfa1();
int n;
n=s.nextInt();
char arr[]=new char[n];
for (int i = 0; i < n; i++) {
arr[i]=s.next().charAt(0);
}
h.AllSort(arr, 0, n-1);
// System.out.println(c);
}*/
//-----------------------------整數劃分------------------------------------------
/*public static int q(int n,int m) {
if (n==1||m==1) {
return 1;
}
if (n<m) {
return q(n, n);
}
if (n==m) {
return 1+q(n, n-1);
}
if (n>m&&m>1) {
return q(n, m-1)+q(n-m, m);
}
return -1;
}
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
suanfa1 h=new suanfa1();
int n;
n=s.nextInt();
int m=n;
System.out.println(h.q(n, m));
}*/
//------------------------------二分查找---------------------------------------
/*public static int search(int arr[],int l,int r,int key) {
int min=(l+r)/2;
if (key==arr[min]) {
return min;
}else if (key<arr[min]) {
return search(arr, l, min-1, key);
}else if (key>arr[min]) {
return search(arr, min+1, r, key);
}
else {
return -1;
}
}
public static void QuickSort(int arr[],int l,int r) {
if (l>=r) {
return;
}
int i=l,j=r;
int v=arr[i];
while (i<j) {
while (i<j&&arr[j]>=v) {
j--;
}
arr[i]=arr[j];
while (i<j&&arr[i]<=v) {
i++;
}
arr[j]=arr[i];
}
arr[i]=v;
QuickSort(arr, l, i-1);
QuickSort(arr, i+1, r);
}
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
suanfa1 h=new suanfa1();
int n;
n=s.nextInt();
int arr[]=new int[n];
for (int i = 0; i < n; i++) {
arr[i]=s.nextInt();
}
int key=s.nextInt();
QuickSort(arr, 0, n-1);
System.out.println(h.search(arr, 0, n-1, key));
}*/
//----------------------------歸/合併排序------------------------------------
/*public static void MergeSort(int arr[],int l,int r) {
if (l>=r) {
return ;
}
int min=(l+r)/2;
MergeSort(arr, l, min);
MergeSort(arr, min+1, r);
_mergesort(arr,l,min,r);
}
public static void _mergesort(int arr[],int l,int mid,int r) {
int aux[]=new int[r-l+1];
for (int i = l; i <= r; i++) {
aux[i-l]=arr[i];
}
int i=l,j=mid+1;
for (int k = l; k <= r; k++) {
if (i>mid) {
arr[k]=aux[j-l];
j++;
}else if(j>r){
arr[k]=aux[i-l];
i++;
}else if (aux[i-l]<aux[j-l]) {
arr[k]=aux[i-l];i++;
}else {
arr[k]=aux[j-l];j++;
}
}
}
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
suanfa1 h=new suanfa1();
int n;
n=s.nextInt();
int arr[]=new int[n];
for (int i = 0; i < n; i++) {
arr[i]=s.nextInt();
}
h.MergeSort(arr, 0, n-1);
//System.out.println(h.search(arr, 0, n-1, key));
for (int i = 0; i < n; i++) {
if (i==n-1) {
System.out.print(arr[i]);
}
else {
System.out.print(arr[i]+" ");
}
}
}*/
//---------------------------快排--------------------------------------
public static void QuickSort(int arr[],int l,int r) {
if (l>=r) {
return;
}
int i=l,j=r;
int v=arr[i];
while (i<j) {
while (i<j&&arr[j]>=v) {
j--;
}
arr[i]=arr[j];
while (i<j&&arr[i]<=v) {
i++;
}
arr[j]=arr[i];
}
arr[i]=v;
QuickSort(arr, l, i-1);
QuickSort(arr, i+1, r);
}
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
suanfa1 h=new suanfa1();
int n;
n=s.nextInt();
int arr[]=new int[n];
for (int i = 0; i < n; i++) {
arr[i]=s.nextInt();
}
h.QuickSort(arr, 0, n-1);
for (int i = 0; i < n; i++) {
if (i==n-1) {
System.out.print(arr[i]);
}
else {
System.out.print(arr[i]+" ");
}
}
}
}