循環演算法
㈠ 使用循環結構實現計算N!的演算法是
循環結構實現就用迭代,簡單來講遞歸就是自己調用自己,循環結構一般分為while和for。
以下是遞歸:
java">//用迭代的方法計算n的階乘
longfactorial(intn)
{
intresult=1;
while(n>1)
{
result*=n;
n-=1;
}
returnresult;
}
在這一題上,循環的代碼就要寫長一點,自己動動手吧,不會吃虧的
㈡ 循環的演算法完全可以轉換為遞歸演算法嗎
遞歸一定可以轉循環 循環不一定可以轉遞歸...
㈢ java 循環演算法
importjava.text.MessageFormat;
importjavax.script.ScriptEngine;
importjavax.script.ScriptEngineManager;
importjavax.script.ScriptException;
publicclassT{
privatestaticfinalStringT="{0}+13*{1}/{2}+{3}+12*{4}-{5}-11+{6}*{7}/{8}-10";
publicstaticvoidmain(String[]args)throwsScriptException{
int[]a=initArray(9);
p(0,a);
}
privatestaticvoide(int[]a)throwsScriptException{
Stringe=MessageFormat.format(T,a[0],a[1],a[2],a[3],a[4],a[5],
a[6],a[7],a[8]);
ScriptEngineManagermanager=newScriptEngineManager();
ScriptEngineengine=manager.getEngineByName("javascript");
Numbern=(Number)engine.eval(e);
if(n.intValue()==66&&n.doubleValue()==n.intValue()){
System.out.println(e+"="+66);
}
}
privatestaticint[]initArray(intn){
int[]a=newint[n];
for(inti=0;i<a.length;i++){
a[i]=i+1;
}
returna;
}
privatestaticvoidp(inti,int[]a)throwsScriptException{
if(i==a.length-1){
e(a);
return;
}
p(i+1,a);
for(intj=i+1;j<a.length;j++){
swap(i,j,a);
p(i+1,a);
swap(j,i,a);
}
}
privatestaticvoidswap(inti,intj,int[]a){
inttemp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
㈣ java for循環演算法的一道題
public class Demo{
public static void main(String[] args){
int sum = 0;
for(int i = 1; i <= 99; i += 2){
sum += i;
System.out.println(「結果是:」 + sum);
}
}
}
㈤ 演算法中的循環
冒泡排序
把一堆數字從小到大排列
for(i=0;i<n;i++)
{
for(j=i;i<n;j++)
{
if(n[i]>n[j])
{
t=n[i];
n[i]=n[j];
n[j]=t;
}
}
}
㈥ C語言演算法問題,演算法高手進,關於for循環的。
for 循環中的判斷條件,能確定的盡量用確定值,而不是用表達式,這是完全正確的,而且最好在程序中這樣做,這樣可以提高運行效率。
上面的兩個循環語句,從寫法上來說,應該用第二個,既然已經確定是 104 了,何必用 100 + 4 呢?
不過 運行速度未必會有區別, C++ 有常量表達式的概念,如果是常量表達式,在編譯時 編譯器就會計算常量表達式的值,並用計算後的值替換常量表達式。
所以在正常情況下,第一個循環可能在編譯器生成代碼時, 已經自動地 將 100 + 4 替換成 104 啦,所以運行速度並無區別,但 這個特性與編譯器的優化有關,不過 現代的C++編譯器都能優化這種情況。
㈦ 演算法中的for循環與while循環
你說的什麼鬼啊
㈧ floyd演算法的三重循環問題
三層循環的意思。第一層就是加入K的中間點,第二層和第三層循環是求每一對頂點在加入新的點後是否存在距離更近的路徑,所以K只能放在最外層。也就是說你再加入新的點後,再進行判斷每對頂點是否距離有變,就相當於一個前提條件。
㈨ 求遞歸循環 演算法
#include<stdio.h>#include <windows.h>
void Calc(BYTE *bpData, long nDataSize, int * npMask, long nMaskSize,
long nCurrentLevel, BYTE * bpOutput)
{
if (nCurrentLevel>=nDataSize)
{
long i;
for (i=0; i<nDataSize-1; i++)
{
printf("%d, ", bpOutput[i]);
}
printf("%d\n", bpOutput[i]);
return;
}
//Find if this level is in the Mask arr.
bool bFound = false;
for (long k=0; k<nMaskSize; k++)
{
if (npMask[k] == nCurrentLevel+1)
{
bFound = true;
break;
}
}
if (! bFound)
{
bpOutput[nCurrentLevel] = bpData[nCurrentLevel];
Calc(bpData, nDataSize, npMask, nMaskSize, nCurrentLevel+1, bpOutput);
}else
{
for (long n=0; n<=9; n++)
{
bpOutput[nCurrentLevel] = (BYTE)n;
Calc(bpData, nDataSize, npMask, nMaskSize, nCurrentLevel+1, bpOutput);
}
}
}
void main()
{
BYTE bpTemp[100];
BYTE bp1[1] = {11};
int arr1[1] = {1};
printf("------------------------------------\n");
Calc(bp1, 1, arr1, 0, 0, bpTemp);
getchar();
printf("------------------------------------\n");
Calc(bp1, 1, arr1, 1, 0, bpTemp);
getchar();
BYTE bp2[4] = {11, 12, 13, 14};
int arr2[2] = {1, 2};
printf("------------------------------------\n");
Calc(bp2, 4, arr2, 2, 0, bpTemp);
getchar();
BYTE bp3[8] = {11, 12, 13, 14, 15, 16, 17, 18};
int arr3[4] = {3,4,7,8};
Calc(bp3, 8, arr3, 4, 0, bpTemp);
getchar();
}
使用遞歸函數。
測試了幾種情形。
按回車可以繼續。
㈩ 套了多個for循環,有沒有什麼演算法加快運算時間
理論上是每次都計算,但實際上編譯器會對這個進行優化,直接使用8代替這個「3+5」,所以一般情況下程序運行的時候一次計算都不需要,因為這個計算是在編譯階段進行的,VS2008環境下,反匯編代碼如下(倒數第2行最後那個8就是「3+5」的替代品): for(int i = 0; i < 5+3; i++) 013D17CE mov dword ptr [i],0 013D17D5 jmp wmain+30h (13D17E0h) 013D17D7 mov eax,dword ptr [i] 013D17DA add eax,1 013D17DD mov dword ptr [i],eax 013D17E0 cmp dword ptr [i],8 013D17E4 jge wmain+45h (13D17F5h) 但是如果與i進行比較的不是常量表達式,是一個函數的返回值,形如for(int i = 0; i < GetValue(); i++),那麼每循環一次這個 GetValue()函數都將會被調用一次。