本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1.n!的递归算法实现
题目分析
递归:程序自己调用自己
n!=n(n-1)(n-2)(n-3)*1
代码实现:C++
#include<iostream>
using namespace std;
int Factorial(int n)
{
if(n==1)return 1;
else return n*Factorial(n-1);
}
int main()
{
int n;
cin>>n;
cout<<Factorial(n)<<endl;
return 0;
}
执行结果:
Java代码:
package Practise915;
import java.util.Scanner;
public class Test {
public static int Factor(int n) {
if(n==1)return 1;
else return n*Factor(n-1);
}
public static void main(String[] args)
{
System.out.println("请输入你要求阶乘的数据为:");
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
System.out.println(Factor(n));
}
}
运行结果:
2.Fibonacci数列
代码实现:C++
#include<iostream>
using namespace std;
int Fibonacci(int n)
{
if(n<=2)return 1;
else return Fibonacci(n-1)+Fibonacci(n-2);
}
int main()
{
int n;
cin>>n;
cout<<Fibonacci(n)<<endl;
return 0;
}
运行结果:
Java代码:
package Practise915;
import java.util.Scanner;
public class Fib {
public static int Fibonna(int n)
{
if(n<=2)return 1;
else return Fibonna(n-1)+Fibonna(n-2);
}
public static void main(String[] args)
{
Scanner scanner=new Scanner(System.in);
System.out.println("请输入您要找的位置:");
int n=scanner.nextInt();
System.out.println(Fibonna(n));
}
}
运行结果:
3.二分查找
代码实现:C++
#include<iostream>
using namespace std;
int Search(int a[],int n,int x)
{
int left=0,right=n-1;
while(left<=right)
{
int middle=(left+right)/2;
if(a[middle]==x)return middle;
if(a[middle]>x)right=middle-1;
else left=middle+1;
}
return -1;
}
int main()
{
int n,x;
cin>>n>>x;
int array[n];
for(int i=0;i<n;i++)
cin>>array[i];
cout<<Search(array,n,x)<<endl;
return 0;
}
运行结果:
java代码:
package Practise915;
import java.util.Scanner;
public class BinarySearch {
public static int BinSearch(int array[],int count,int x)
{
int left=0,right=count-1;
while(left<=right)
{
int middle=(left+right)/2;
if(x==array[middle])return middle;
else if(x>array[middle])left=middle+1;
else right=middle-1;
}
return -1;
}
public static void main(String[] args)
{
Scanner scanner=new Scanner(System.in);
int array[]= {1,4,5,6,8,9,11,12,14,16};
int len=array.length;
System.out.println("请输入你要查找的数据:");
int number=scanner.nextInt();
System.out.println(BinSearch(array, len, number));
}
}
运行结果:
4.二分搜索
代码实现:C++
#include<iostream>
using namespace std;
int Search(int a[],int n,int x)
{
int i=0,j=0;
int left=0,right=n-1;
int flag=-1;
int middle;
while(left<=right)
{
middle=(left+right)/2;
if(a[middle]==x)flag=middle;
if(a[middle]>x)right=middle-1;
else left=middle+1;
}
if(flag==-1)
{
i=right;
j=left;
}
else
{
j=i=middle;
}
cout<<"i的值为:"<<i<<" j的值为:"<<j<<endl;
}
int main()
{
int n,x;
cin>>n>>x;
int array[n];
for(int i=0;i<n;i++)
cin>>array[i];
Search(array,n,x);
return 0;
}
运行结果:
Java代码实现:
package Practise915;
import java.util.Scanner;
public class BinarySearch001 {
public static int BinarySearch(int array[],int count,int x)
{
int left=0,right=count-1;
int i=0,j=0;
int middle=0;
int flags=-1;
while(left<=right)
{
middle=(left+right)/2;
if(array[middle]==x)
{
i=middle;
j=i;
flags=middle;
System.out.println("i的值为:"+i+" j的值为:"+j);
break;
}
else if(x>array[middle])left=middle+1;
else right=middle-1;
}
if(flags==-1)
{
i=right;
j=left;
System.out.println("i的值为:"+i+" j的值为:"+j);
}
return -1;
}
public static void main(String[] args)
{
int arr[]= {1,3,4,6,9};
int len=arr.length;
System.out.println("请输入要查找的数据:");
Scanner scanner=new Scanner(System.in);
int number=scanner.nextInt();
int result=BinarySearch(arr, len, number);
}
}
运行结果:
5.查找中位数
代码实现:C++
#include <iostream>
using namespace std;
int SearchMiddleNumber(int x[],int y[],int x_left,int x_right,int y_left,int y_right)
{
if (x_left == x_right)return x[x_left];
else if (y_left == y_right)return y[y_left];
int x_middle, y_middle;
x_middle = (x_left + x_right) / 2;
y_middle = (y_left + y_right) / 2;
if (x[x_middle] > y[y_middle])
{
x_right = x_middle;
y_left = y_middle;
}
else if (x[x_middle] < y[y_middle])
{
x_left = x_middle;
y_right = y_middle;
}
else return x[x_middle];
SearchMiddleNumber(x, y, x_left, x_right, y_left, y_right);
}
int main()
{
int x[10] = { 1,3,5,7,9,11,13,15,17,19 };
int y[10] = { 2,4,6,8,10,12,14,16,18,20 };
int length_x = sizeof(x) / sizeof(x[0]);
int length_y = sizeof(y) / sizeof(y[0]);
int x_low=0, y_low=0 ;
int midNum = SearchMiddleNumber(x, y, x_low, length_x, y_low, length_y);
cout << midNum << endl;
return 0;
}
运行结果:
Java
package Practise915;
public class FindMiddleNumber {
public static int search(int[] a, int[] b, int la, int ra, int lb, int rb) {
int ma = (la + ra) / 2;
int mb = (lb + rb + 1) / 2;
if (la == ra) {
return (lb == rb) ? Math.min(a[la], b[lb]) : Math.min(a[la], b[rb]);
} else if (lb == rb) {
return Math.min(b[lb], a[ra]);
}
if (la == ra-1 && lb == rb-1) {
mb = (lb + rb) / 2;
}
return a[ma] == b[mb] ? a[ma] : (a[ma] > b[mb] ? search(a, b, la, ma ,mb, rb) : search(a, b, ma, ra, lb, mb));
}
public static void main(String[] args)
{
int x[] = { 1,3,5,7,9,11,13,15,17,19 };
int y[] = { 2,4,6,8,10,12,14,16,18,20 };
int la=0,lb=0;
int ra=x.length;
int rb=y.length;
int midNumber=search(x, y, la, ra, lb, rb);
System.out.println(midNumber);
}
}
}
运行结果:
总结:
分治法的精髓:
分–将问题分解为规模更小的子问题;
治–将这些规模更小的子问题逐个击破;
合–将已解决的子问题合并,最终得出“母”问题的解;
收获:
实践是检验真理的唯一标准,只有动手体验,才会感受到编程的魅力,有bug并不可怕,可怕的是停滞不前。分治法-分而治之,将大问题化解为小问题,将小问题解决,进而解决大问题。