這是一個(gè)約瑟夫環(huán)的問(wèn)題
創(chuàng)新互聯(lián)建站憑借專業(yè)的設(shè)計(jì)團(tuán)隊(duì)扎實(shí)的技術(shù)支持、優(yōu)質(zhì)高效的服務(wù)意識(shí)和豐厚的資源優(yōu)勢(shì),提供專業(yè)的網(wǎng)站策劃、成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站優(yōu)化、軟件開發(fā)、網(wǎng)站改版等服務(wù),在成都十年的網(wǎng)站建設(shè)設(shè)計(jì)經(jīng)驗(yàn),為成都上1000+中小型企業(yè)策劃設(shè)計(jì)了網(wǎng)站。
解答如下:
依據(jù)提議,可以將題目等價(jià)變換為:“n(n=17)人編號(hào)為0到(n-1)圍成一圈,0號(hào)人開始從0報(bào)數(shù),凡是報(bào)數(shù)為m-1 (m=3)倍數(shù)的人離開圈子,繼續(xù)到一個(gè),問(wèn)他編號(hào)”
一開始的狀態(tài)
0,1,2,3,4,5 ..... (n-2), (n-1) 【n個(gè)人】
第一個(gè)人被踢之后 設(shè)第一個(gè)被踢的人的編號(hào)為k, 則 k = m%n-1 【當(dāng)n=17,m=3時(shí),k=2。也就是說(shuō)編號(hào)為2的人離開了圈子】
這時(shí)候的狀態(tài)
0, .... (k-1), (k+1) ,(k+2)...(n-2),(n-1) 【(n-1)個(gè)人,當(dāng)n=17,m=3時(shí): 0,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16】
將這時(shí)候的編號(hào)做轉(zhuǎn)換. 因?yàn)槭菄且粋€(gè)圈子,下一個(gè)開始數(shù)的是(k+1).所以也可以表示為
(k+1),(k+2) ... (n-2),(n-1),0....(k-1) 【(n-1)個(gè)人,當(dāng)n=17,m=3時(shí): 3,4,5,6,7,8,9,10,11,12,13,14,15,16,0,1】
重新編號(hào)。得到:
0,1,2,3,4...(n-3),(n-2)【(n-1)個(gè)人】 這個(gè)時(shí)候 ,這里重新構(gòu)成了一個(gè)約瑟夫環(huán)。也就是說(shuō),這是一個(gè)遞推的關(guān)系。
這里我們進(jìn)行了重新編號(hào)。那么 (n-1)個(gè)人和 n個(gè)人之間的編號(hào)不一樣的。但是兩者之間有一定的關(guān)系,可以沖新編號(hào)推導(dǎo)出老的
公式如下: i' = (i+k)%(n-1) 【比如,當(dāng)n=17,m=3時(shí) . 新的環(huán)編號(hào)是 (n-2),我要求他在老的環(huán)中的編號(hào),那么編號(hào)是 i' = ( (n-2) + k ) % (n-1) = 17%16 = 1,就是老的換種編號(hào)為1的那一個(gè) 】
反過(guò)來(lái)有 :i = (i'+m)%n
有了上面的推斷,可以代碼如下:
int ysf(int n,int m){
if(n==1){
return 0; //當(dāng)環(huán)內(nèi)只有一個(gè)人的時(shí)候,就是他自己
}
return (ysf(n-1,m) + m ) % n ;
}
------------------完整代碼---------------------
public class Test{
public static void main(String[] args){
int a = 17;
int b = 3;
System.out.println(ysf(a,b));
}
static int ysf(int n,int m){
if(n==1){
return 0;
}
return (ysf(n-1,m) +m) % n;
}
}
是這個(gè)嗎?
/**[12,127,85,66,27,34,15,344,156,344,29,47,....]
這是某設(shè)備測(cè)量到的工程數(shù)據(jù)。
因工程要求,需要找出最大的5個(gè)值。
一般的想法是對(duì)它排序,輸出前5個(gè)。但當(dāng)數(shù)據(jù)較多時(shí),這樣做很浪費(fèi)時(shí)間。因?yàn)閷?duì)輸出數(shù)據(jù)以外的數(shù)據(jù)進(jìn)行排序并非工程要求,即便是要輸出的5個(gè)數(shù)字,也并不要求按大小順序,只要找到5個(gè)就可以。
以下的代碼采用了另外的思路。考慮如果手里已經(jīng)抓著5個(gè)最大數(shù),再來(lái)一個(gè)數(shù)據(jù)怎么辦呢?讓它和手里的數(shù)據(jù)比,如果比哪個(gè)大,就搶占它的座位,讓那個(gè)被擠出來(lái)的再自己找位子,....
* **/
import java.util.*;
public class B23{
public static ListInteger max5(ListInteger lst){
if(lst.size()=5) return lst;
int a = lst.remove(lst.size() - 1); // 填空
//System.out.println(a);
ListInteger b = max5(lst);
for(int i=0; ib.size(); i++)
{
int t = b.get(i);
if(at)
{
lst.set(i, a); // 填空
a = t;
}
}
return b;
}
public static void main(String[] args){
ListInteger lst = new VectorInteger();
lst.addAll(Arrays.asList(12,127,85,66,27,34,15,344,156,344,29,47));
System.out.println(max5(lst));
}
}
import java.util.Scanner;public class Test {public static void main(String[] args) {int num = 5;int[] n = new int[num];Scanner sc = new Scanner(System.in);System.out.println("請(qǐng)輸入"+num+"位會(huì)員的積分");for(int i=0;inum;i++){System.out.print("第"+(i+1)+"位會(huì)員積分:");n[i]=sc.nextInt();}System.out.println("\n序號(hào)\t歷史積分");for(int i=0;in.length;i++){System.out.println(i+1+"\t"+n[i]);}sc.close();}}
//遞歸
private static double wages1(int n)
{
if (n = 0)
{
return 0;
}
else if (n == 1)
{
return 1500*12;
}
else
{
return wages1(n-1) * 1.1;
}
}
//遞推
private static double wages2(int n)
{
if (n = 0)
{
return 0;
}
double wages = 1500 * 12;
for (int i = 1; i n ; i++)
{
wages *= 1.1;
}
return wages;
}
遞歸是吧,這樣就可以了 #include "stdio.h" static int k=0; void F(int a) { if (a==1) return ; k++; if(a%2==1) a=a*3+1; else a=a/2; printf("%d\n",a); F(a); } void main() { int a=0; printf("input your number\n"); scanf("%d",a); F(a); printf("the function totally calculated %d times",k); }
int a=0;
int n=0;
String s ;
try{
System.out.print("請(qǐng)輸入一個(gè)整數(shù)n:");
BufferedReader br=
new BufferedReader(new InputStreamReader(System.in));
s=br.readLine();
a=Integer.parseInt(s);
} catch(IOException e){}
以上代碼請(qǐng)放在main函數(shù)里面。
當(dāng)前題目:java遞推完整代碼 遞推問(wèn)題編程
文章URL:http://m.rwnh.cn/article6/hhgjig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、微信小程序、外貿(mào)建站、網(wǎng)站導(dǎo)航、網(wǎng)站制作、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)