發現乙個以前沒有注意到的地方
#include
using
namespace std;
intgetans()
intmain()
//執行結果
9
挺有意思的,在main中呼叫了getans()函式,getans()中,最後一句是先計算a + b,之後將a + b 賦值給ans,再之後返回ans,此時getans()中ans 的值已經是9了,雖然呼叫結束之後,getans()所在的記憶體被釋放掉了。
這可以用來幹什麼呢?準確來說,在函式中,返回值語句可以是一條計算賦值語句,這一點可以做什麼呢?
其實可以用來優化用遞迴法來求斐波那契數列。
斐波那契數列都知道,f(0) = 0,f(1) = 1,f(n) = f(n-1) + f(n-2),這幾乎是學習遞迴的必備知識。
首先來看一般的斐波那契數列求法。
#include
#include
using
namespace std;
intgetans
(int n)
intmain()
//執行用時
1134903170
用時7297
上面令n = 45,可以看到f(45) = 1134903170,但是用時為7297ms,這可以說是很慢了。因為涉及了大量的重複計算。沒有利用起來。
現在可以使用上面的知識點「在函式中,返回值語句可以是一條計算賦值語句」。
#include
#include
#include
using
namespace std;
int f[50]
;//斐波那契數列
intgetans
(int n)
intmain()
//執行結果
1134903170
用時1
結果非常明顯,使用了這條結論,可以使得時間變為了1毫秒。
當然了,如果是僅僅求斐波那契數列,最好還是使用遞推。
#include
#include
#include
using
namespace std;
intmain()
//執行結果
1134903170
用時0
不過可以看到,使用優化過的遞迴與遞推,執行時間相差無幾。
以下出自《演算法筆記》
排列組合裡面c(n,m)意為從n個數裡面選擇m個不同的數。且有c(n,n) = 1,c(n,0) = 1。
可以使用公式來計算,但是非常容易超出int型別的資料範圍。
可以遞迴來做。這種選取可以分為兩種不同的方案數之和:一是不選最後乙個數,從前n - 1個數中選m個數;第二種方案是選最後乙個數,並且從前n - 1個數中選m - 1個數。
即c(n,m) = c(n-1,m)+ c(n-1,m-1)。
從直觀上來看,該公式總是將n減1,而m要麼保持原樣,要麼減1,直到達到邊界m等於n或者是m等於0。
於是可以很快得到下面的**
long
long
getans
(int n,
int m)
這個計算完全不涉及到階乘,但是有另外的問題:重複計算。在計算c(n,m)的過程中,有很多的資料是已經計算過得了,但是沒有在再次使用時直接使用,而是又去計算了一遍。因此不妨將已經計算過了的資料進行記錄,下次碰到時,直接使用。
//res陣列中res[n][m]為c(n,m);
long
long res[67]
[67]=
;//初始值為0
long
long
getans
(int n,
int m)
遞推
//res陣列中res[n][m]為c(n,m);
long
long res[67]
[67]=
;//初始值為0,res是乙個下三角陣
void
getans()
}}
ajax返回資料賦值給前台變數
var result ajax console.log result 以這種方式會的直接是json格式 伺服器相應的json資料 var result ajax console.log result 以這種方式返回的也是json 對服務相應的資料進行了包裝 如下圖 responsetext為伺服器響...
使用okhttp時沒有返回json資料
今天踩過的大坑.這是一段使用okhttp進行post請求的 執行結果返回的是com.squareup.okhttp.internal.http.realresponsebody 52858c28這段字串,一臉懵逼,本來應該是返回一段json字串的。解決方法 replace string json r...
go panic時如何讓函式返回資料
現在有這樣乙個問題 某函式如果正常執行,返回0,如果panic,則返回1,怎麼搞呢?package main import fmt func test int var p int p 0 return 0 func main 這樣顯然不行,因為那個return 1是針對匿名函式的,而非test函式。...