AOJ_0158 Collatz's Problem

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0158
ひさしぶりのHaskell
たぶんlet式の意味を正確には把握していない

main = do n <- getContents
	  let vs = map (\cs -> (read cs :: Int)) $ words n
	  putStr $ unlines $ map (\n -> show n) $ solve vs

solve :: [Int] -> [Int]
solve (0:_) = []
solve (v:vs) = solve' v 0 : solve vs

solve' :: Int -> Int -> Int
solve' 1 n = n
solve' v n =
	if v `mod` 2 == 0
	 then solve' (v `div` 2) (n+1)
	 else solve' (3*v+1)     (n+1)

比較用c言語ソース

#include <cstdio>
using namespace std;

int main(){
	int n, i;
	while(scanf("%d", &n) && n){
		for(i = 0;; i++){
			if(n == 1)
				break;
			if(n%2 == 0) n /= 2;
			else n = 3 * n + 1;
		}
		printf("%d\n", i);
	}
	return 0;
}